AGR/ENV指令
- 前言
- ARG
- 作用
- 格式
- 说明
- 生效范围
- 使用示例
- ENV
- 作用
- 格式
- 说明
- 使用环境变量
- 使用示例
- ARG 和 ENV 的区别
前言
- 本篇来学习下Dockerfile中的AGR/ENV指令
ARG
作用
- 定义一个可以在构建镜像时使用的变量
格式
ARG <name>[=<default value>]
说明
- 在执行 docker build 时,可以通过 --build-arg name=value 为声明的变量赋值
- –build-arg 指定参数会覆盖 Dockerfile 中指定的同名参数。
- 如果用户指定了未在 Dockerfile 中定义的构建参数 ,则构建会输出 警告 。
- ARG 只在构建时期有效,运行时期无效。
- 不建议使用构建时变量来传递注入 github 密码、用户凭据等机密,因为构建时变量的值可以通过 docker history 来观察到。
- ARG 变量定义从 Dockerfile 定义的行开始生效。
- 使用 ENV 指令定义的环境变量始终会覆盖同名的 ARG 指令。
生效范围
- 如果在 FROM 指令之前指定,那么只能用于 FROM 指令中
- 在FROM 之后使用,需要再次指定 ARG
- 多阶段构建的时候,ARG 定义的变量,每个 FROM 都能用
使用示例
ARG BASE_IMAGE=alpine
ARG PARSM='HELLO DOCKER'
# 如果在 FROM 指令之前指定,那么只能用于 FROM 指令中
FROM ${BASE_IMAGE}LABEL author="大海"# 构建时期执行的指令。ARG 变量无效
RUN echo '1------1'
RUN echo ${BASE_IMAGE}
# FROM指令后,需重新指定
ARG PARAM='6666'
RUN echo ${PARAM}
RUN echo '2------2'# 运行时(docker run/docker start)执行的指令,ARG 变量无效
CMD ["/bin/sh","-c","echo 2222;echo $PARAM"]
- 构建镜像
docker build -t test02 --force-rm --no-cache -f Dockerfile --build-arg PARAM=888 .
- 启动容器
- 运行时ARG指令无效,所以未输出PARAM的值
docker run -it test02
ENV
作用
- 定义环境变量
格式
ENV <key>=<value> ...
说明
- ENV在构建期和运行期都有效,并且使用 ENV 指定定义的环境变量始终会覆盖同名的 ARG 指令。
- 可以使用 docker inspect 查看值,并使用 docker run -e = 修改 ENV 定义的环境变量。
使用环境变量
- 如下指令中可使用
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
ONBUILD
- 使用方式
- $variable_name
- ${variable_name}
- ${variable:-word}:表示如果设置了 variable,那么结果就是那个值;如果未设置变量,则结果将是 word
- ${variable:+word}:表示如果设置了 variable,则结果为 word,否则为空字符串
使用示例
- dockerfile
FROM alpineLABEL author="大海"# ARG 变量定义从 Dockerfile 定义的行开始生效。
ARG param="Hi DH"# ENV 在构建期和运行期都有效,但是只能在运行期进行修改,修改通过 docker run -e name=value 命令。
ENV app=CSDN# 在构建时期会运行的指令(根据 Dockerfile 创建一个镜像的整个过程时期)
RUN echo ‘-----’
RUN echo ${param}
RUN echo ${app}
RUN echo '-----'# 在运行时候会运行的指令(根据之前创建的镜像启动一个容器,容器启动默认运行的命令)
# docker start 或 docker run
CMD ["/bin/sh","-c","echo 2222;echo $param;echo app_$app"]
- 启动容器
- ENV指令在运行时也有效,输出了定义的值
docker run -it test
- 修改默认值
docker run -it -e app=xes test
ARG 和 ENV 的区别
- ARG 定义的变量只会存在于镜像构建过程(docker build有效),启动容器(docker run/start无效)后并不保留这些变量
- ENV 定义的变量在启动容器后仍然保留