我希望能够在docker-compose.yml中使用env变量,并在docker-compose时传入值。这就是例子。我今天使用基本的docker run命令执行此操作,该命令包装在我自己的脚本中。没有任何这样的bash包装器,有没有办法通过compose实现它?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
我希望能够在docker-compose.yml中使用env变量,并在docker-compose时传入值。这就是例子。我今天使用基本的docker run命令执行此操作,该命令包装在我自己的脚本中。没有任何这样的bash包装器,有没有办法通过compose实现它?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
Answers:
template.yml
,这是您的docker-compose.yml
with环境变量。来源env.sh; rm -rf docker-compose.yml; envsubst <“ template.yml”>“ docker-compose.yml”;
docker-compose.yml
将使用正确的环境变量值生成一个新文件。
示例template.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
似乎docker-compose 1.5+已启用变量替换:https://github.com/docker/compose/releases
最新的Docker Compose允许您从compose文件访问环境变量。因此,您可以获取环境变量,然后像下面那样运行Compose:
set -a
source .my-env
docker-compose up -d
然后,您可以使用$ {VARIABLE}在docker-compose.yml中引用变量,如下所示:
db:
image: "postgres:${POSTGRES_VERSION}"
这是来自文档的更多信息,在这里获取:https : //docs.docker.com/compose/compose-file/#variable-substitution
当您使用此配置运行docker-compose时,Compose在外壳程序中查找POSTGRES_VERSION环境变量并替换其值。对于本示例,Compose在运行配置之前将映像解析为postgres:9.3。
如果未设置环境变量,则Compose替换为空字符串。在上面的示例中,如果未设置POSTGRES_VERSION,则image选项的值为postgres:。
$ VARIABLE和$ {VARIABLE}语法均受支持。不支持扩展的外壳样式功能,例如$ {VARIABLE-default}和$ {VARIABLE / foo / bar}。
如果需要在配置值中放置文字美元符号,请使用双美元符号($$)。
而且我认为此请求请求中已添加了此功能:https : //github.com/docker/compose/pull/1765
我注意到人们对Docker的环境变量支持存在问题。让我们回到bash之类的基础知识,而不是在Docker中处理环境变量!这是使用bash脚本和.env
文件的更灵活的方法。
.env文件示例:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
然后在同一目录中运行此bash脚本,该脚本应正确部署所有内容:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
只需使用通常的bash语法在撰写文件中引用您的env变量(即从文件中${SECRET_KEY}
插入)。SECRET_KEY
.env
请注意,COMPOSE_CONFIG
在我的定义.env
文件,并在我的bash脚本中使用,但你可以很容易地只需更换{$COMPOSE_CONFIG}
与my-compose-file.yml
在bash脚本。
还要注意,我通过用“ myproject”前缀命名所有容器来标记此部署。您可以使用任何名称,但是可以帮助您识别容器,以便以后方便地引用它们。假设您的容器是无状态的,那么根据您的.env文件参数和撰写的YAML文件,此脚本将快速删除并重新部署容器。
更新 由于此答案似乎很受欢迎,因此我写了一篇博客文章,更深入地描述了我的Docker部署工作流:http : //lukeswart.net/2016/03/lets-deploy-part-1/这在您添加时可能会有所帮助部署配置(例如nginx配置,LetsEncrypt证书和链接的容器)的复杂性更高。
grep foo file.text
代替cat file.text | grep foo
。就我而言,我不得不export $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
。
docker-compose up
,不适用于docker-compose run
。
.env
下env_file
。然后您可以在docker-compose.yml
使用${VARIABLE}
似乎docker-compose现在对file中的默认环境变量具有本机支持。
您需要做的就是在一个名为的文件中声明您的变量.env
,它们将在docker-compose.yml中可用。
例如,对于.env
包含内容的文件:
MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image
您可以在内部访问变量docker-compose.yml
或将其转发到容器中:
my-service:
image: ${IMAGE_NAME}
environment:
MY_SECRET_KEY: ${MY_SECRET_KEY}
.env
,例如,config.env
对我来说不起作用。
以下内容适用于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}"
将环境变量用于卷时,您需要:
在包含 文件的同一文件夹中创建.envdocker-compose.yaml
文件
在.env
文件中声明变量:
HOSTNAME=your_hostname
更改$hostname
到${HOSTNAME}
的docker-compose.yaml
文件
proxy:
hostname: ${HOSTNAME}
volumes:
- /mnt/data/logs/${HOSTNAME}:/logs
- /mnt/data/${HOSTNAME}:/data
当然,您可以在每个构建中动态地执行此操作,例如:
echo "HOSTNAME=your_hostname" > .env && sudo docker-compose up
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
最好的方法是在docker-compose.yml
文件外部指定环境变量。您可以使用env_file
设置,并在同一行中定义环境文件。然后再次进行docker-compose应当使用新的环境变量重新创建容器。
这是我的docker-compose.yml的样子:
services:
web:
env_file: variables.env
注意:docker-compose期望环境文件中的每一行都采用
VAR=VAL
格式。避免export
在.env
文件内部使用。另外,该.env
文件应放置在执行docker-compose命令的文件夹中。
您还不能... 但这是另一种选择,像docker-composer.yml生成器一样思考:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
基本上是一个将替换变量的shell脚本。此外,您还可以在CI流程结束时使用Grunt任务来构建docker compose文件。
我为此创建了一个简单的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"
如
VERSION=1.0.0
deploy.sh
INPUTFILE=docker-compose.yml
RESULT_NAME=docker-compose.product.yml
NAME=test
prepare() {
local inFile=$(pwd)/$INPUTFILE
local outFile=$(pwd)/$RESULT_NAME
cp $inFile $outFile
while read -r line; do
OLD_IFS="$IFS"
IFS="="
pair=($line)
IFS="$OLD_IFS"
sed -i -e "s/\${${pair[0]}}/${pair[1]}/g" $outFile
done <.env
}
deploy() {
docker stack deploy -c $outFile $NAME
}
prepare
deploy
使用.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
env SOME_VAR="I am some var" OTHER_VAR="I am other var" docker stack deploy -c docker-compose.yml
使用版本3.6:
version: "3.6"
services:
one:
image: "nginx:alpine"
environment:
foo: "bar"
SOME_VAR:
baz: "${OTHER_VAR}"
labels:
some-label: "$SOME_VAR"
two:
image: "nginx:alpine"
environment:
hello: "world"
world: "${SOME_VAR}"
labels:
some-label: "$OTHER_VAR"
我通过此链接https://github.com/docker/cli/issues/939获得了它