拥有以下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"]
虽然很久以前就提出了这个问题,但这里有一个类似问题的答案: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
文件中定义的环境变量,我认为它们无法在构建时传递给容器。
这种方法违背了Docker和大多数DevOps方法背后的“一次构建,随处运行”理论。使用这种方法,您需要为您希望使用的每个环境构建容器。通过这样做,您无法安全地说出容器是否在开发环境中工作,它将在分段和生产中工作,因为您没有使用相同的容器。
您最好将所需的所有配置文件添加到容器中,并编写一个entrypoint脚本,在容器启动时选择/复制该环境的数据到正确的位置。您还可以将此方法应用于容器上的其他配置,例如使用jinja2模板的模板化Apache配置等。
它可以这样工作:
泊坞窗,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文件