你可以使用.env文件作为独立的Dockerfile吗?

hY8*_*Xib 13 docker

我正在研究一个具有大量环境变量的简单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" ]
Run Code Online (Sandbox Code Playgroud)

我想,重新解释这个问题的一个好方法是:如何在Dockerfile中高效加载多个环境变量?如果您无法加载文件,则无法将docker文件提交到github.

hal*_*fer 19

是的,有几种方法可以做到这一点.

Docker撰写

在Docker Compose中,您可以在文件本身中提供环境变量,或者指向外部env文件:

# docker-compose.yml
version: '2'
services:

  service-name:
    image: service-app
    environment:
    - GREETING=hello
    env_file:
    - .env
Run Code Online (Sandbox Code Playgroud)

顺便提一下,一个有点相关的好功能是你可以使用多个Compose文件,每个后续的文件都添加到另一个.因此,如果以上是定义基础,那么您可以这样做(例如,每个运行时环境):

# docker-compose-dev.yml
version: '2'
services:

  service-name:
    environment:
    - GREETING=goodbye
Run Code Online (Sandbox Code Playgroud)

然后你可以运行它:

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
Run Code Online (Sandbox Code Playgroud)

仅限Docker

要仅在Docker中执行此操作,请使用入口点或命令运行中间脚本,因此:

#Dockerfile

....

ENTRYPOINT ["sh", "bin/start.sh"]
Run Code Online (Sandbox Code Playgroud)

然后在你的开始脚本中:

#!/bin/sh

source .env

python /manager.py
Run Code Online (Sandbox Code Playgroud)

我过去曾将这个相关的答案用作自己的有用参考.

  • 但问题是,如果没有 docker-compose,这是否可行?如果我想要的只是这个 .env 文件,这似乎有点矫枉过正…… (2认同)

Jus*_*ice 8

我真的很喜欢 @halfers 方法,但这也可以。docker run接受一个名为的可选参数--env-file,它非常有用。

所以你的 docker 文件可能看起来像这样。

COPY .env .env
Run Code Online (Sandbox Code Playgroud)

然后在构建脚本中使用:

COPY .env .env
Run Code Online (Sandbox Code Playgroud)

  • 为什么我需要`COPY .env .env`?docker run 引用的 --env-file 可以有任何名称,对吗?例如“docker run --env-file .local.env my_docker_image”。我在这里错过了一些要点吗? (2认同)

arn*_*old 5

有多种选项: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
Run Code Online (Sandbox Code Playgroud)

(您也可以只引用以前的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
Run Code Online (Sandbox Code Playgroud)

您也可以从文件中加载环境变量。该文件应使用语法variable=value(将变量设置为给定值)或语法(从本地环境variable获取),并使用#进行注释。

关于在(映像)构建时或(容器)运行时所需的变量之间的差异,以及如何组合ENV以及ARG对于动态构建参数,您可以尝试以下操作:ARG或ENV,在这种情况下使用哪个变量