45-Dockerfile-ARG/ENV指令

简介: 45-Dockerfile-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 alpine
LABEL 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 定义的变量在启动容器后仍然保留

相关文章
|
数据安全/隐私保护 Docker 容器
Dockerfile(15) - ARG 指令详解
Dockerfile(15) - ARG 指令详解
981 0
|
缓存 Linux Go
Dockerfile(11) - COPY 指令详解
Dockerfile(11) - COPY 指令详解
2492 0
|
17天前
|
Shell Android开发
./build_native.sh执行错误
./build_native.sh执行错误
|
12月前
|
缓存 Linux Docker
44-Dockerfile-ADD/COPY指令
44-Dockerfile-ADD/COPY指令
|
12月前
|
Shell 开发工具 git
43-Dockerfile-FROM/LABEL/RUN指令
43-Dockerfile-FROM/LABEL/RUN指令
|
12月前
|
Docker 容器
48-Dockerfile-CMD/ENTRYPOINT指令
48-Dockerfile-CMD/ENTRYPOINT指令
|
JSON 缓存 Go
Go-常用命令go的使用(build、env、run、fmt等)
Go-常用命令go的使用(build、env、run、fmt等)
357 0
Go-常用命令go的使用(build、env、run、fmt等)
|
Docker 容器
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
本文是博主学习docker 制作镜像指令的记录,希望对大家有所帮助
165 0
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
|
应用服务中间件 Shell nginx
Dockerfile(7) - ENV 指令详解
Dockerfile(7) - ENV 指令详解
1881 0
Dockerfile(7) - ENV 指令详解
|
缓存 Linux Go
Dockerfile(10) - ADD 指令详解
Dockerfile(10) - ADD 指令详解
1637 0