当前位置: 首页 > 知识库问答 >
问题:

如何在不影响Dockerfile的情况下加载多个环境变量?

丁振海
2023-03-14

我正在处理一个简单的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。

共有3个答案

马飞
2023-03-14

我也可以用这种方法docker run采用一个名为--env file的可选参数,非常有用。

因此,您的docker文件可能如下所示。

COPY .env .env

然后在构建脚本中使用:

docker build -t my_docker_image . && docker run --env-file .env my_docker_image
田修为
2023-03-14

有多种选择:
https://docs.docker.com/engine/reference/commandline/run/#set-环境变量——e-env-env-file

docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

(您也可以只参考以前导出的变量,请参见下面的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

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

关于(image)构建时或(容器)运行时所需变量之间的区别,以及如何将ENVARG组合为动态构建参数,您可以尝试以下操作:
ARG或ENV,在这种情况下使用哪一个?

谭泳
2023-03-14

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

在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

过去,我用这个相关的答案作为对自己有用的参考。

为了进一步说明我在评论中的观点,如果您将入口点设置为shell或Python脚本,那么Unix信号(stop、kill等)很可能不会传递到您的进程中。这是因为该脚本将成为进程ID 1,这使其成为容器中所有其他进程的父进程——在Linux/Unix中,预期该PID将向其子进程转发信号,但除非明确实现,否则不会发生。

要纠正这一点,可以安装init系统。我使用来自Yelp的dumb init。如果你想更好地理解它,这个repo还提供了大量的细节,如果你只是想“安装并忘记”,它还提供了简单的安装说明。

 类似资料:
  • 问题内容: 当我使用chdir()更改当前工作目录时,为什么getenv(“ PWD”)没有给出当前的工作目录?我还需要setenv(“ PWD”,newDir,1)吗? 输出:(可执行文件的位置是/ home / user) 更改/启动 目录已更改。当前的工作目录是“ / home / user”“ / boot” 问题答案: 是的,如果要更改环境变量,则必须明确地执行此操作。 它是在事件的正常

  • 有的时候我们访问一个网站的时候,可能会显示“服务器暂时不能访问”,请问这个时候是不是开发人员在测试生产环境,所以暂时停止了用户的访问? 比如我现在发了一个生产端的最新版本,我需要一个小时的时间去到线上进行测试,那么这种情况下的最佳实践是什么呢?如何避免影响到用户的使用呢? 我的生产环境经验有点少,请大佬看到这个题目尽可能的发散性的回答,就是说你想到的问题和答案都能写在评论中,让我能多学习学习,这种

  • 问题内容: 我给人的印象是,可以如下将环境变量设置在一行上,以最大程度地减少中间图像。 但是,运行基于此代码段的容器并调用,我看到变量没有单独分配,而是组合为单个字符串。 但是,如果我按如下所示显式设置每个变量,则可以得到预期的输出,并且在调用变量时没有错误。 问题: 是否可以将环境变量的设置合并在一行上?如果是这样,我该怎么办?这是一个好习惯吗? 问题答案: 有两种用于指定环境的格式。如果您需要

  • 在 Elasticsearch 中,我想用两个与 OR 聚合的不同子句来过滤我的结果,例如,返回属性 A= 真或属性 B= true 的文档。 我一直在尝试使用布尔查询来实现这一点。我的基本查询只是中的文本搜索。如果我将这两个子句放在出现类型中,它会用AND聚合它们。如果我将这两个子句放在出现类型中,并将1设置为1,那么我得到了正确的结果。但是,匹配这两个条件的文档得分较高,因为“应该”在查询上下

  • 到目前为止,我运行的是一台视窗8.1电脑,它没有像Android Studio或Eclipse这样的IDE的存储或内存。我想下载Android SDK工具,没有IDE。如何才能做到这一点?

  • 问题内容: 我有一个从源代码下载并构建GTK的dockerfile,但是以下行未更新映像的环境变量: 我读到我应该使用ENV来设置环境值,但是以下指令似乎也不起作用: 这是我的整个Dockerfile: 问题答案: 您可以使用环境更换你如下: