多阶段构建中的Docker环境变量

11

鉴于这个.env文件:

TEST=33333

考虑到这个 docker-compose.yml 文件:

  service_name:
    image: test
    env_file: .env
    environment:
      TEST: 22222

考虑到这个Dockerfile文件:

FROM an_image AS builder

FROM another_image
ENV TEST 11111

CMD ["/bin/echo $TEST"]

每当我在容器中构建并运行此镜像时,它会打印11111

如果我从Dockerfile中删除ENV 11111行,则我的TEST环境变量为空...

父镜像接收到环境变量,但子镜像没有接收到吗?

谢谢!

编辑:

  1. 尝试使用ENV TEST ${TEST}无效($TEST为空)
  2. 删除ENV TEST无效($TEST为空)
2个回答

14

所以这不是一个多阶段的问题。

看起来ENV变量只有在运行容器(docker-compose up)时才会被使用,而不是构建镜像(docker-compose build)时。所以你必须使用arguments:

.env:

TEST=11111

docker-compose.yaml

version: '3'
services:
  test:
    build:
      context: .
      args:
        TEST: ${TEST}

Dockerfile:

FROM nginx:alpine
ARG TEST
ENV TEST ${TEST}
CMD ["sh", "-c", "echo $TEST"]

测试命令:

docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest

文档真的有点不足。

参考:https://github.com/docker/compose/issues/1837


我无法重现你的问题,你真的在CMD中评估变量吗?CMD是运行时而不是构建时。 - BMitch
能否将我的.env文件传递给args参数? - Rebar
Dockerfile中的ENV变量实际上在构建阶段(即RUN命令)和运行容器中作为环境变量都是可用的。请参见此处的文档:https://docs.docker.com/engine/reference/builder/#env - Sean McCarthy

10
问题并非特别关于多阶段构建。
而是关于 Dockerfile 的 ARG 和 docker-compose YAML 的 build args(“构建参数”)之间的差异; 以及 Dockerfile 的 ENV 和 docker-compose YAML 的 environment/.env。 文档已经更新(比原帖更近),现在非常清晰: args
添加构建参数,这些环境变量仅在构建过程中可访问。 Docker-compose 文档的示例。
从简单的开始,只展示 Dockerfile 和 YAML 之间的交互:
ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"

build:
  context: .
  args:
    buildno: 1
    gitcommithash: cdc3b19

build:
  context: .
  args:
    - buildno=1
    - gitcommithash=cdc3b19

将示例与问题联系起来的例子:

请参见本主题中的其他答案。


文档和加深理解

逐层抽象学习

建议从Dockerfile的抽象层次开始学习,并逐层加深理解。在添加下一层抽象之前,请确保您理解了每个层次。

  1. Dockerfile(然后尝试使用默认的ENV运行容器,然后尝试使用--env,然后尝试使用ARG--build-arg进行操作)

  2. 然后添加docker-compose细节并进行实践。

  3. 然后回到Dockerfile,理解多阶段构建。

Dockerfile

一篇有用的博客文章--重点是Dockerfile,但在任何情况下,在添加诸如docker-compose YAML之类的额外抽象层之前,最好先了解Dockerfile。

https://vsupalov.com/docker-arg-env-variable-guide/

from vsupalov.com post about this subject, https://vsupalov.com/docker-arg-env-variable-guide/

docker-compose

然后是docker-compose的官方文档:

多阶段Dockerfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接