我正在研究一个具有大量环境变量的简单Docker镜像。你能导入一个像docker-compose一样的环境变量文件吗?我在docker文件文档中找不到任何相关内容。
Dockerfile
FROM python:3.6
ENV ENV1 9.3
ENV ENV2 9.3.4
...
ADD . /
RUN pip install -r requirements.txt
CMD [ "python", "./manager.py" ]
我想,重新解释这个问题的一个好方法是:如何在Dockerfile中高效加载多个环境变量?如果您无法加载文件,则无法将docker文件提交到github。
答案 0 :(得分:8)
是的,有几种方法可以做到这一点。
在Docker Compose中,您可以在文件本身中提供环境变量,或者指向外部env文件:
# docker-compose.yml
version: '2'
services:
service-name:
image: service-app
environment:
- GREETING=hello
env_file:
- .env
顺便提一下,一个有点相关的好功能是你可以使用多个Compose文件,每个后续的文件都会添加到另一个文件中。因此,如果以上是定义基础,那么您可以这样做(例如,每个运行时环境):
# docker-compose-dev.yml
version: '2'
services:
service-name:
environment:
- GREETING=goodbye
然后你可以这样运行它:
docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
要仅在Docker中执行此操作,请使用入口点或命令运行中间脚本,因此:
#Dockerfile
....
ENTRYPOINT ["sh", "bin/start.sh"]
然后在你的开始脚本中:
#!/bin/sh
source .env
python /manager.py
我used this related answer过去对我自己有用的参考。
答案 1 :(得分:2)
有多种选择:
https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e-env-env-file
docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
(您也可以只引用之前的exported
个变量,请参阅下面的USER
。
回答有关.env文件的问题的人是:
cat env.list
# This is a comment
VAR1=value1
VAR2=value2
USER
docker run --env-file env.list ubuntu env | grep VAR
VAR1=value1
VAR2=value2
docker run --env-file env.list ubuntu env | grep USER
USER=denis
您还可以从文件加载环境变量。此文件应使用语法variable=value
(将变量设置为给定值)或variable
(从本地环境获取值)和#用于注释。
关于(图像)构建时或(容器)运行时所需的变量之间的差异以及如何将ENV
和ARG
组合用于动态构建参数,您可以尝试这样做:
ARG or ENV, which one to use in this case?
答案 2 :(得分:0)
如果您需要环境变量运行时,最简单的方法是创建一个启动器脚本,使用多个export
语句设置环境,然后启动您的过程。
如果您需要构建时间,请查看ARG
和ENV
语句。你每个变量都需要一个。
答案 3 :(得分:0)
我真的很喜欢@halfers方法,但这也可以工作。 docker run
带有一个称为--env-file
的可选参数,非常有用。
因此您的docker文件可能如下所示。
FROM datadog/agent:latest
VOLUME ["/conf.d", "/mnt/logs"]
COPY .env .env
,然后在构建脚本中使用:
docker build -t my_docker_image . && docker run --env-file .env my_docker_image