鉴于此.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为空)所以这不是一个多阶段的问题。
看来ENV
变量仅在运行容器时使用(docker-compose up
)。不是在建设时间(docker-compose build
)。所以你必须使用arguments
:
.ENV:
TEST=11111
泊坞窗,compose.yml:
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
说真的,文档有点缺乏。
这不是具体的多阶段。
这是关于Dockerfile ARG
和docker-compose YAML build
args
(“build arguments”)之间的差异;和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级别抽象,向上。在添加下一层抽象之前,确保了解每个层。
ENV
,然后使用--env
,然后使用ARG
和--build-arg
)一篇有用的博客文章 - 专注于Dockerfile,但在所有情况下,最好先了解Dockerfiles,然后再添加额外的抽象层,例如docker-compose YAML。
https://vsupalov.com/docker-arg-env-variable-guide/
然后docker-撰写官方文档: