多阶段构建中的Docker环境变量
给定此多阶段构建中的Docker环境变量,docker,environment-variables,docker-compose,dockerfile,Docker,Environment Variables,Docker Compose,Dockerfile,给定此.env文件: TEST=33333 service_name: image: test env_file: .env environment: TEST: 22222 FROM an_image AS builder FROM another_image ENV TEST 11111 CMD ["/bin/echo $TEST"] 给定此docker compose.yml文件: TEST=33333 service_name:
.env
文件:
TEST=33333
service_name:
image: test
env_file: .env
environment:
TEST: 22222
FROM an_image AS builder
FROM another_image
ENV TEST 11111
CMD ["/bin/echo $TEST"]
给定此docker compose.yml
文件:
TEST=33333
service_name:
image: test
env_file: .env
environment:
TEST: 22222
FROM an_image AS builder
FROM another_image
ENV TEST 11111
CMD ["/bin/echo $TEST"]
给定此Dockerfile
文件:
TEST=33333
service_name:
image: test
env_file: .env
environment:
TEST: 22222
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
)。因此,您必须使用参数
:
.env:
TEST=11111
version: '3'
services:
test:
build:
context: .
args:
TEST: ${TEST}
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
docker compose.yaml:
TEST=11111
version: '3'
services:
test:
build:
context: .
args:
TEST: ${TEST}
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:
TEST=11111
version: '3'
services:
test:
build:
context: .
args:
TEST: ${TEST}
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
测试命令:
TEST=11111
version: '3'
services:
test:
build:
context: .
args:
TEST: ${TEST}
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 YAMLbuild
args
(“构建参数”)之间的差异;和DockerfileENV
&docker编写YAML环境
/.ENV
args
添加生成参数,这些参数是仅在生成过程中可访问的环境变量
来自
从简单开始,只显示Dockerfile
和YAML之间的交互:
ARG buildno
ARG gitcommithash
RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
将其与问题联系起来的示例:
看
文档&加深您的理解 一次学习一层抽象 我建议从Dockerfile的抽象级别向上。确保在添加下一层抽象之前理解每一层
ENV
,然后使用--ENV
,然后使用ARG
和--build ARG
)
CMD
中评估变量?CMD
是运行时,而不是构建时。是否可以将my.env文件传递给args?