Docker有ARG,ENV和.env,如何使用它们?

Docker有ARG,ENV和.env,如何使用它们?当书写 Dockerfile 文件或运行 Docker 容器时 经常遇到使用变量的情况 我们可能会首先想到环境变量 Dockerfile 还有一个 ARG 指令 它们有什么使用场景和区别 这篇文章就回答这个问题 要点 env 文件 使用 docker

大家好,欢迎来到IT知识分享网。

当书写Dockerfile文件或运行Docker容器时,经常遇到使用变量的情况,我们可能会首先想到环境变量,Dockerfile还有一个“ARG”指令,它们有什么使用场景和区别?这篇文章就回答这个问题。

要点

  • “.env”文件,使用docker-compose.yaml文件,里面以“$”开头的变量将被“.env”文件定义的变量替换,两个文件要放在同一个目录下
  • “ENV”定义的变量值在构建镜像和运行容器时都可以使用
  • “ARG”定义的变量仅在构建镜像时可用
  • “env_file”,在“docker-compose.yaml”中可以通过该key引入一个文件,里面包含多个环境变量
  • “ARG”和“ENV”配置的变量如果传入到镜像中,通过“docker history”命令可见,所以不要将敏感数据通过二者传入镜像

ARG和ENV

“ARG”仅在构建镜像时可用,运行中的容器不能访问ARG变量的值,也就是说“CMD”和“ENTRYPOINT”不能访问ARG的值,运行下面Dockerfile文件构建的镜像是没有任何输出的,

FROM alpine:3.11 ARG name=aneirin ENTRYPOINT /bin/sh -c "echo $name;sleep 3"

“ENV”变量相比较“ARG”变量作用域就显得大些,它不仅在镜像构建时可用,在容器运行后,也可以使用,因此运行下面Dockerfile构建的镜像是有输出的,

FROM alpine:3.11 ENV name=aneirin //默认值为aneirin,通常使用"--build-arg"选项传入值 ENTRYPOINT /bin/sh -c "echo $name;sleep 3"

输出:

aneirin@host-1:~/test$ docker run test:0.1 aneirin

在运行容器时如果传入相同名称的环境变量,原来的值会被覆盖。

如何设置“ARG”的值

ARG变量值在Dockerfile文件或执行“docker build”时通过选项“–build-arg”赋值。

1,通过Dockerfile文件直接赋值

FROM alpine:3.11 ARG name=aneirin RUN echo "Hello ${name}" ENTRYPOINT /bin/sh -c "echo $name;sleep 3"

构建镜像时会有ARG的值会输出,

...... Step 3/4 : RUN echo "Hello ${name}" ---> Running in f9e7b92b8f00 Hello aneirin ......

2,通过“–build-arg”赋值

Dockerfile文件如下:

FROM alpine:3.11 ARG name RUN echo "Hello ${name}" ENTRYPOINT /bin/sh -c "echo $name;sleep 3" #运行容器是没有输出的

构建镜像命令:“docker build -t test:0.1 –build-arg name=aneirin .”,和上面的效果是相同的。

如何设置“ENV”的值

1,直接在Dockerfile中指定,和ARG是相同的,提供默认值的方式

2,通过ARG将值传给ENV,如下,

FROM alpine:3.11 ARG arg_name ENV name=$arg_name ENTRYPOINT /bin/sh -c "echo $name;sleep 3"

这种方式可以在构建镜像时方便修改环境变量的值,使用不多

3,运行容器时通过命令行传入变量值,

FROM alpine:3.11 ENV name=aneirin #必须提供默认值,否则构建会失败 ENTRYPOINT /bin/sh -c "echo $name;sleep 3"

运行容器时,可动态传入值:“docker run -e name=rachel test:0.1”,原来的值被覆盖。

4,从运行容器的主机环境传入变量,

export name=rachel //当前主机环境配置环境变量name docker run -e name test:0.1 env //容器从当前主机环境得到name的值

5,运行容器时通过选项“–env-file”选项传入值。和第三种方式类似,读者可以自己测试下。

env文件(.env)

“.env”和“docker-compose.yaml”要配合使用,两个文件需要放在相同的目录下,使用方式和上面“ENV”的第5种传值方式类似。

在“.env”文件中定义环境变量,“docker-compose.yaml”文件声明的环境变量会自动引用配置在文件“.env”中的值,

“.env”文件:

env_name="Alice"

“Dockerfile”:

FROM alpine:3.11 ENV name=aneirin ENTRYPOINT /bin/sh -c "echo $name;sleep 3"

“docker-compose.yaml”

version: '3' services: test: image: test:0.1 environment: - name="${env_name}"

执行“docker-compose up”,输出name值为“Alice”

总结

文章主要展示Dockerfile中“ARG”和“ENV”指令的区别和用法,特别“ENV”指令使用比较频繁,值得深入学习。对于敏感数据可以将其保存在文件“.env”中,使用“docker-compose up”方式运行容器。

希望这篇文章能帮到正在努力的你,欢迎关注并评论!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/178284.html

(0)
上一篇 2025-05-10 10:10
下一篇 2025-05-10 10:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信