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

时间:2017-11-07 18:33:08

标签: docker environment-variables docker-compose dockerfile

给出这个.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 个答案:

答案 0 :(得分:7)

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

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

<强> .ENV

TEST=11111

<强>搬运工-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

答案 1 :(得分:2)

这与多阶段操作无关。

这与Dockerfile ARG和docker-compose YAML build args(“构建参数”)之间的区别有关;和Dockerfile ENV和docker-compose YAML environment / .env

The docs were updated (more recently than the original post), and it is fairly clear now:

  

args

     

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

来自the docker-compose docs的示例

从简单开始,仅显示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

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

请参见the other answer in this thread.


文档并加深您的理解

一次学习一层抽象

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

  1. Dockerfile(然后使用默认ENV来运行Dockerfile中正在运行的容器,然后使用--env进行播放,然后使用ARG和{{1} })

  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官方文档:

多阶段Dockerfiles