我希望能够在docker-compose中使用env变量。Yml,在docker-compose up时传入的值。这就是例子。

今天我使用的是基本的docker run命令,该命令包含在我自己的脚本中。 有没有一种方法来实现它与撰写,没有任何这样的bash包装?

proxy:
  hostname: $hostname
  volumes:
    - /mnt/data/logs/$hostname:/logs
    - /mnt/data/$hostname:/data

当前回答

据我所知,这还在进行中。他们想这么做,但还没有发布。参见1377 (@Andy提到的“新”495)。

我最终实现了@Thomas提出的“生成。yml作为CI的一部分”方法。

其他回答

创建模板。Yml,也就是docker-compose。Yml与环境变量。 假设你的环境变量在文件'env.sh'中 将下面的代码放在sh文件中并运行它。

env.sh来源; Rm -rf docker-compose.yml; Envsubst < "模板。docker-compose.yml";

一个新的文件docker-compose。将使用正确的环境变量值生成Yml。

示例模板。yml文件:

oracledb:
        image: ${ORACLE_DB_IMAGE}
        privileged: true
        cpuset: "0"
        ports:
                - "${ORACLE_DB_PORT}:${ORACLE_DB_PORT}"
        command: /bin/sh -c "chmod 777 /tmp/start; /tmp/start"
        container_name: ${ORACLE_DB_CONTAINER_NAME}

示例env.sh文件:

#!/bin/bash 
export ORACLE_DB_IMAGE=<image-name> 
export ORACLE_DB_PORT=<port to be exposed> 
export ORACLE_DB_CONTAINER_NAME=ORACLE_DB_SERVER

从1.25.4开始,docker-compose支持——env-file选项,允许你指定一个包含变量的文件。

你的简历应该是这样的:

hostname=my-host-name

和命令:

docker-compose --env-file /path/to/my-env-file config

以下代码适用于docker-compose 3.x 在容器内设置环境变量

方法- 1直接法

web:
  environment:
    - DEBUG=1
      POSTGRES_PASSWORD: 'postgres'
      POSTGRES_USER: 'postgres'

方法- 2“。env”文件

在docker-compose.yml文件所在的位置创建一个.env文件

$ cat .env
TAG=v1.5
POSTGRES_PASSWORD: 'postgres'

你的合成文件会是这样的

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"
    postgres_password: "${POSTGRES_PASSWORD}"

只关注环境变量的默认值和强制值的问题,并更新@modulito的答案:

在docker-compose中使用默认值和强制强制值。现在支持Yml文件(来自docs):

同时支持$VARIABLE和${VARIABLE}语法。此外,当使用2.1文件格式时,可以使用典型的shell语法提供内联默认值: 如果环境中的VARIABLE未设置或为空,${VARIABLE:-default}计算为默认值。 ${VARIABLE-default}只有在环境中未设置VARIABLE时才计算为默认值。

类似地,下面的语法允许你指定强制变量: ${变量:?如果环境中的VARIABLE未设置或为空,则err}退出,并显示包含err的错误消息。 ${变量?如果在环境中未设置VARIABLE,则err}退出,并显示包含err的错误消息。

其他扩展的shell样式的特性,如${VARIABLE/foo/bar},是不支持的。

据我所知,这还在进行中。他们想这么做,但还没有发布。参见1377 (@Andy提到的“新”495)。

我最终实现了@Thomas提出的“生成。yml作为CI的一部分”方法。