当前位置: 首页 > 面试题库 >

您可以将.env文件用于独立的Dockerfile吗?

欧阳晗日
2023-03-14
问题内容

我正在处理具有大量环境变量的简单Docker映像。您是否可以像docker-
compose一样导入环境变量文件?我在Docker文件文档中找不到关于此的任何内容。

Docker文件

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撰写

在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

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

#Dockerfile

....

ENTRYPOINT ["sh", "bin/start.sh"]

然后在您的启动脚本中:

#!/bin/sh

source .env

python /manager.py

过去,我已将此相关答案用作自己的参考。

PID 1更新

为了进一步说明我的意见,如果将入口点设置为shell或Python脚本,则Unix信号(停止,终止等)很可能不会传递到您的进程中。这是因为该脚本将成为进程ID1,这使其成为容器中所有其他进程的父进程-在Linux /
Unix中,期望此PID将信号转发给其子进程,但是除非您明确实现,它不会发生。

要解决此问题,您可以安装一个初始化系统。我使用Yelp的dumb-init。如果您想更好地了解它,此版本库还具有很多详细信息,或者如果您只是想“安装后忘了”,则提供简单的安装说明。



 类似资料:
  • 问题内容: 是否可以根据构建的值在Dockerfile中有条件地设置变量? 例如:类似 更新:基于Mario的答案的当前用法: 但是,先运行然后进入主机,我仍然可以 问题答案: 是的,可以,但是您需要使用build参数作为标志。您可以使用Shell的参数扩展功能来检查条件。这是概念验证的Docker文件: 测试版本:

  • 问题内容: 我已经编写了一个.c源代码(在Eclipse中),它使用libcap库来获取与网络流量有关的信息。现在,我已经在Eclipse中使用ndk- build创建了一个可执行二进制文件。我已将在libs / armeabi文件夹中创建的二进制文件推送到我的android的/ data / local /文件夹中(根目录为nexus 5,Lollipop),并尝试执行该二进制文件。但是andr

  • 问题内容: 我想自动化一个相当简单的任务。为此,我编写了一个小的PHP脚本,该脚本使用PHP-CLI从命令行运行。现在,我想将此脚本移交给某人,但我不想: 放弃源代码 请他在系统上安装PHP 有没有一种方法可以创建PHP脚本的.exe版本。我真的不太担心反编译。我更担心要求人们安装和配置PHP。 问题答案: peachpie. http://www.peachpie.io https://gith

  • 问题内容: 许多摆动文本组件将解释HTML。如果可能的话,我想用CSS设置HTML样式。有人知道怎么做吗? 问题答案: 该混音小子框架可以让你做到这一点。

  • 我正在尝试dockerize一个基本的nodejs应用程序。我的dockerfile如下 但我总是收到同样的错误 我该怎么解决?

  • 我们正在使用Swagger、AWS API网关和Lambda函数与NodeJS构建API。API网关将进行请求验证,但是根据设计,lambda函数需要将请求对象重新验证为API网关代理请求事件。这是有意义的,因为理论上我们可以通过其他事件源(例如SNS)调用lambda函数来重用它们。 因此,我们需要一个NodeJS工具,它可以根据swagger规范验证请求(不仅是正文,还有参数等)-正是swag