gpt4 book ai didi

docker - 如何在不弄乱 Dockerfile 的情况下加载多个环境变量?

转载 作者:IT老高 更新时间:2023-10-28 12:45:41 25 4
gpt4 key购买 nike

我正在开发一个包含大量环境变量的简单 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 编写

在 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

我有 used this related answer作为过去对我自己很有帮助的引用。

PID 1 更新

为了放大我在评论中的评论,如果您将入口点设为 shell 或 Python 脚本,很可能是 Unix signals (停止、杀死等)不会传递给您的进程。这是因为该脚本将变为 process ID 1 ,这使它成为容器中所有其他进程的父进程 - 在 Linux/Unix 中,期望这个 PID 将信号转发给它的子进程,但除非你明确地实现它,否则它不会发生。

要解决这个问题,您可以安装一个 init 系统。我用 dumb-init from Yelp .如果您想更好地理解它,这个 repo 还包含大量详细信息,或者如果您只想“安装并忘记”,则可以使用简单的安装说明。

关于docker - 如何在不弄乱 Dockerfile 的情况下加载多个环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46917831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com