拥有以下docker-compose文件:
db:
build: .
environment:
- MYSQL_ROOT_PASSWORD=password
- ENV=test
env_file: .env
有没有办法使用docker-compose.yml中声明的env变量(作为环境或在env_file中声明)作为Dockerfile的一部分而不在Dockerfile中声明它们?像这样:
FROM java:7
ADD ${ENV}/data.xml /data/
CMD ["run.sh"]
答案 0 :(得分:17)
虽然很久以前就提出了这个问题,但这里有一个类似问题的答案:Pass environment variables from docker-compose to container at build stage
基本上,要在容器的构建时使用变量,必须在docker-compose.yml
中定义变量:
build:
context: .
args:
MYSQL_ROOT_PASSWORD: password
ENV: test
然后使用Dockerfile
ARG
中引用它
ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/
关于*.env
文件中定义的环境变量,我认为它们无法在构建时传递给容器。
答案 1 :(得分:7)
这种方法违反了“一次构建”,“随处运行”和#39; Docker背后的理论和大多数DevOps方法。使用这种方法,您需要为您希望使用的每个环境构建容器。通过这样做,您无法安全地说出容器是否在开发环境中工作,它将在分段和生产中起作用,因为您没有使用相同的容器。
最好将所需的所有配置文件添加到容器中,然后编写entrypoint脚本,在容器启动时选择/复制该环境的数据到正确的位置。您也可以将此方法应用于容器上的其他配置,例如使用jinja2模板等的模板化Apache配置。
答案 2 :(得分:1)
这样可以正常工作:
docker-compose.yml
version: '3.5'
services:
container:
build:
context: .
args:
ENV: ${ENV} # from .env file
env_file:
- .env
Dockerfile
# from compose args
ARG ENV
ADD ${ENV}/data.xml /data/
.env
ENV=myenv
因此所有值均取自.env文件