【发布时间】:2019-12-16 02:10:44
【问题描述】:
我搜索了site:stackoverflow.com dockerfile: ENV, RUN - layers or images 并阅读了Does Docker EXPOSE make a new layer? 和What are Docker image "layers"?。
在阅读文档Best practices for writing Dockerfiles 并尝试理解这部分时:
每个 ENV 行创建一个新的中间层,就像 RUN 命令。这意味着即使您取消设置环境变量 在未来的层中,它仍然存在于该层中,其值可以 被抛弃。
我想起了上面的那部分:
在旧版本的 Docker 中,将 图像中的层数,以确保它们具有性能。这 添加了以下功能以减少此限制:
只有指令 RUN、COPY、ADD 创建图层。 其他指令 创建临时中间图像,并且不增加 构建。
我读过How to unset "ENV" in dockerfile?。并重做文档页面上给出的示例,它确实证明ENV 没有取消:
$ docker build -t alpine:envtest -<<HITHERE
> FROM alpine
> ENV ADMIN_USER="mark"
> RUN unset ADMIN_USER
> HITHERE
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM alpine
latest: Pulling from library/alpine
89d9c30c1d48: Already exists
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
---> 965ea09ff2eb
Step 2/3 : ENV ADMIN_USER="mark"
---> Running in 5d34f829a387
Removing intermediate container 5d34f829a387
---> e9c50b16c0e1
Step 3/3 : RUN unset ADMIN_USER
---> Running in dbcf57ca390d
Removing intermediate container dbcf57ca390d
---> 2cb4de2e0257
Successfully built 2cb4de2e0257
Successfully tagged alpine:envtest
$ docker run --rm alpine:envtest sh -c 'echo $ADMIN_USER'
mark
对于ENV 和RUN,输出显示相同的“删除中间容器”。
我最近下载了docker,别以为它那么老:
$ docker --version
Docker version 19.03.5, build 633a0ea
也许RUN instruction 和RUN command 是不同的东西?ENV、RUN - 它们是创建图层、图像还是容器?
【问题讨论】:
-
RUN unset ...只生效到当前行结束;试试RUN unset ADMIN_USER && echo $ADMIN_USER。ENV是唯一会持续更改环境变量设置的东西。 -
@David Maze,谢谢,看起来它会工作。我也想看看我是否理解文档。
标签: docker dockerfile