我正在处理一个简单的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。
我也可以用这种方法docker run
采用一个名为--env file
的可选参数,非常有用。
因此,您的docker文件可能如下所示。
COPY .env .env
然后在构建脚本中使用:
docker build -t my_docker_image . && docker run --env-file .env my_docker_image
有多种选择:
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)构建时或(容器)运行时所需变量之间的区别,以及如何将ENV
和ARG
组合为动态构建参数,您可以尝试以下操作:
ARG或ENV,在这种情况下使用哪一个?
是的,有几种方法可以做到这一点。
在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: 问题答案: 您可以使用环境更换你如下: