Bash 如何使用docker compose环境变量填充配置文件
我是docker compose的新手。Bash 如何使用docker compose环境变量填充配置文件,bash,docker,rabbitmq,docker-compose,Bash,Docker,Rabbitmq,Docker Compose,我是docker compose的新手。 我试图了解如何通过docker compose传递环境变量,以在Dockerfile的构建阶段填充配置文件中缺少的变量值,因此在运行阶段,我将运行服务-rabbitmq,其配置中填充了环境变量值 在docker compose yml文件中,我有一个env_文件:,还有环境:,问题是如何将它们转发到配置文件中 任何帮助,一个想法将非常感谢与一个简单的例子 当然 示例rabbitmq配置文件(带有env变量,需要用$SSL\U端口的值填充该变量): 假设您
我试图了解如何通过docker compose传递环境变量,以在
Dockerfile
的构建阶段填充配置文件中缺少的变量值,因此在运行阶段,我将运行服务-rabbitmq
,其配置中填充了环境变量值
在docker compose yml文件中,我有一个env_文件:
,还有环境:
,问题是如何将它们转发到配置文件中
任何帮助,一个想法将非常感谢与一个简单的例子
当然
示例rabbitmq配置文件(带有env变量,需要用$SSL\U端口的值填充该变量):
假设您的配置文件在容器内部使用变量
$SSL\u PORT
,并且您希望从主机传递环境变量以用于构建,这可以在docker compose.yml
中完成。YAML支持使用环境变量,因此,您可以使用environment:
,后跟希望在运行时传递给容器的变量数组
例如:
version: '3'
services:
your-app:
build:
context: .
dockerfile: Dockerfile
environment:
- "SSL_PORT=${PORT_VARIABLE_FROM_HOST}"
要解决问题并确保变量实际上已分配到容器运行中,请执行以下操作:
docker exec-it printenv
这应列出容器内的所有环境变量。问题可分为两部分:
--env file file.env
),或者指定单个环境变量(--env VARIABLE=value
),docker将使它们在容器内可用
第二个问题根据所使用的配置框架有不同的解决方案
例如,如果您正在使用类似或的东西,您可以在配置本身中放置对环境变量的引用,配置框架将自动扩展它
相反,如果您正在配置不支持环境变量扩展的第三方软件,则需要在执行目标软件之前进行一些预处理
这通常是通过创建一个带有自定义标记的docker图像来完成的。此入口点负责修改目标软件的配置,导出已知的环境变量,然后启动软件
此类入口点脚本的示例可以是:
#!/bin/sh
sed -i "s/\$SSL_PORT/$SSL_PORT/g" /etc/software.conf
exec $@
以这种方式修改配置文件可能是危险的,并且容易出错,因此在编写此类脚本时要小心
更新:
如果您只想在原始入口点开始之前执行一些预处理,那么您可以遵循以下简单模式:假设原始入口点被称为docker entrypoint.sh
,您需要做的就是使用以下内容创建docker entrypoint pre.sh
:
#!/bin/bash
# Perfom all the needed preprocessing here...
# Invoke the original entrypoint passing the command and arguments
exec /docker-entrypoint.sh $@
如果使用新入口点构建docker映像,并使用以下内容启动容器:
docker运行--rm测试图像回显“这是一个测试”
将发生的情况是,docker entrypoint pre.sh
将使用参数echo
调用,这是一个测试。预处理完成后,将使用相同的参数调用原始入口点docker entrypoint.sh
,从而保持原始图像的行为
更新2:
为了添加新入口点,您必须创建一个继承自原始入口点的新Docker图像。假设原始图像是rabbit:latest
,您需要创建一个Dockerfile
,其中包含以下内容:
FROM rabbit:latest
COPY docker-entrypoint-pre.sh /docker-entrypoint-pre.sh
ENTRYPOINT ["/docker-entrypoint-pre.sh"]
然后从包含Dockerfile
和docker entrypoint pre.sh
的目录中,使用docker build-t myrabbit:latest.
构建映像
此时,您的预处理逻辑有了一个新的图像myrabbit:latest
。看看这篇文章是否有助于@TarunLalwani:如何将源自env_文件:
或environment:
节的环境变量传递到docker构建阶段的配置文件中?如果在构建过程中传递,则需要使用构建参数@JavaSa:……但是请注意,如果您试图在构建期间生成该配置,那么您就很难放弃很多灵活性。这(生成配置文件)通常在运行时进行,因为运行容器的位置通常与生成映像的位置完全不同。另外,使ssl端口在容器中可配置似乎是没有必要的:容器网络是隔离的,您可以使用端口映射在任意主机端口上公开服务。@larsks:除了我需要传入我要为rabbitmq创建的用户和密码的端口之外,在此特定示例中,它将与默认用户一起使用。因此,我仍然需要模板机制来填充conf。我需要在构建时而不是运行时使用它,这意味着在dockerfile
中,如果我使用printenv,我看不到环境变量。请指定bellow bash script命令的翻译,此外,我如何才能不重写现有的rabbitmqdocker entrypoint.sh
,而只是用我自己的脚本来扩展它,以便在此之前运行。Docker-entrypoint.sh正在使用该配置,因此我需要在启动它之前进行一些修改。作为示例,我发布的bash脚本只是使用sed将每次出现的$SSL\u PORT
替换为该环境变量的值。这是我的转到方法,因为sed
FROM rabbit:latest
COPY docker-entrypoint-pre.sh /docker-entrypoint-pre.sh
ENTRYPOINT ["/docker-entrypoint-pre.sh"]