我希望能够在docker-compose中使用env变量。Yml,在docker-compose up时传入的值。这就是例子。
今天我使用的是基本的docker run命令,该命令包含在我自己的脚本中。 有没有一种方法来实现它与撰写,没有任何这样的bash包装?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
我希望能够在docker-compose中使用env变量。Yml,在docker-compose up时传入的值。这就是例子。
今天我使用的是基本的docker run命令,该命令包含在我自己的脚本中。 有没有一种方法来实现它与撰写,没有任何这样的bash包装?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
当前回答
创建模板。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
其他回答
使用.env文件在docker-compse.yml中定义动态值。不管是port还是其他值。
示例docker-compose:
testcore.web:
image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
volumes:
- c:/logs:c:/logs
ports:
- ${TEST_CORE_PORT}:80
environment:
- CONSUL_URL=http://${CONSUL_IP}:8500
- HOST=${HOST_ADDRESS}:${TEST_CORE_PORT}
在.env文件中,你可以定义这些变量的值:
CONSUL_IP=172.31.28.151
HOST_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002
我有一个简单的bash脚本,我为此创建,这只是意味着在使用之前在你的文件上运行它: https://github.com/antonosmond/subber
基本上只要创建你的合成文件使用双花括号表示环境变量,例如:
app:
build: "{{APP_PATH}}"
ports:
- "{{APP_PORT_MAP}}"
双花括号中的任何内容都将被同名的环境变量替换,因此如果我设置了以下环境变量:
APP_PATH=~/my_app/build
APP_PORT_MAP=5000:5000
运行subber docker-compose。Yml生成的文件看起来像这样:
app:
build: "~/my_app/build"
ports:
- "5000:5000"
据我所知,这还在进行中。他们想这么做,但还没有发布。参见1377 (@Andy提到的“新”495)。
我最终实现了@Thomas提出的“生成。yml作为CI的一部分”方法。
就像这样简单:
使用文档中提到的命令行:
docker-compose --env-file ./config/.env.dev config
或者使用.env文件,我认为这是最简单的方法:
web:
env_file:
- web-variables.env
带样本的文件
只关注环境变量的默认值和强制值的问题,并更新@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},是不支持的。