Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用docker compose环境变量填充配置文件_Bash_Docker_Rabbitmq_Docker Compose - Fatal编程技术网

Bash 如何使用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的新手。
我试图了解如何通过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


这应列出容器内的所有环境变量。问题可分为两部分:

  • 将配置值注入容器中
  • 让目标软件使用这些配置值
  • 第一个问题是通过使用环境变量来解决的:如您所述,您可以指示docker使用env文件(
    --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命令的翻译,此外,我如何才能不重写现有的rabbitmq
    docker 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"]