给出这个.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
环境变量为空...
父图像是接收环境变量而不是子图像?
谢谢!
编辑:
ENV TEST ${TEST}
没有工作($ TEST为空)ENV TEST
没有工作($ TEST为空)答案 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
严重的是文档有点缺乏。
答案 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
添加构建参数,它们是只能在构建过程中访问的环境变量。
从简单开始,仅显示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抽象级别开始。在添加下一层抽象之前,请确保您了解每一层。
Dockerfile(然后使用默认ENV
来运行Dockerfile中正在运行的容器,然后使用--env
进行播放,然后使用ARG
和{{1} })
然后在其中添加docker-compose详细信息,并使用它们。
然后循环回到Dockerfile,并了解多阶段构建。
一个有用的博客文章-专注于Dockerfile,但是在所有情况下,最好在添加额外的抽象层(例如docker-compose YAML)之前,先了解Dockerfile。
https://vsupalov.com/docker-arg-env-variable-guide/
然后是docker-compose官方文档: