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

Mik*_*ier 5 environment-variables docker dockerfile docker-compose

鉴于此.env文件:

TEST=33333
Run Code Online (Sandbox Code Playgroud)

鉴于此docker-compose.yml文件:

  service_name:
    image: test
    env_file: .env
    environment:
      TEST: 22222
Run Code Online (Sandbox Code Playgroud)

鉴于此Dockerfile文件:

FROM an_image AS builder

FROM another_image
ENV TEST 11111

CMD ["/bin/echo $TEST"]
Run Code Online (Sandbox Code Playgroud)

每当我在容器中构建并运行此图像时,它都会打印出来11111.

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

父图像是接收环境变量而不是子图像?

谢谢!

编辑:

  1. 尝试ENV TEST ${TEST}不起作用($ TEST为空)
  2. 删除ENV TEST不起作用($ TEST为空)

Mik*_*ier 9

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

看来ENV变量仅在运行containers(docker-compose up)时使用.不是在构建时(docker-compose build).所以你必须使用arguments:

.env:

TEST=11111
Run Code Online (Sandbox Code Playgroud)

docker-compose.yaml:

version: '3'
services:
  test:
    build:
      context: .
      args:
        TEST: ${TEST}
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM nginx:alpine
ARG TEST
ENV TEST ${TEST}
CMD ["sh", "-c", "echo $TEST"]
Run Code Online (Sandbox Code Playgroud)

测试命令:

docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest
Run Code Online (Sandbox Code Playgroud)

说真的,文档有点缺乏.

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


dri*_*her 7

问题不在于具体的多阶段。

这是关于 DockerfileARG和docker -compose YAML build args(“构建参数”)之间的差异;和 Dockerfile 和 docker ENV-compose YAML environment/ .env

文档已更新(比原来的帖子更新时间更近),现在已经很清楚了:

args

添加构建参数,它们是只能在构建过程中访问的环境变量。

来自docker-compose 文档的示例

从简单开始,只显示Dockerfile和 YAML之间的交互:

ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
Run Code Online (Sandbox Code Playgroud)
build:
  context: .
  args:
    buildno: 1
    gitcommithash: cdc3b19

build:
  context: .
  args:
    - buildno=1
    - gitcommithash=cdc3b19
Run Code Online (Sandbox Code Playgroud)

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

请参阅此线程中的另一个答案。


文档和加深您的理解

一次学习一层抽象

我建议从 Dockerfile 抽象级别开始,向上。在添加下一层抽象之前,请确保您了解每一层。

  1. Dockerfile(然后使用 Dockerfile 运行容器...使用 default ENV,然后使用--env,然后使用ARG--build-arg

  2. 然后添加 docker-compose 详细信息,并使用它们。

  3. 然后循环回到 Dockerfiles 并了解多阶段构建。

文件

一篇有用的博客文章——关注 Dockerfile,但在所有情况下,最好先单独了解 Dockerfile,然后再添加额外的抽象层,例如 docker-compose YAML。

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

来自 vsupalov.com 关于这个主题的帖子,https://vsupalov.com/docker-arg-env-variable-guide/

docker-compose

然后 docker-compose 官方文档:

多阶段 Dockerfile