我希望能够在docker-compose.yml中使用env变量,这些变量的值是在docker-compose up
时传入的。这就是例子。
我今天用基本的docker run命令来完成这个任务,它被包装在我自己的脚本中。有没有一种方法可以用compose来实现它,而不需要任何这样的bash包装器?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
看起来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}"
使用此配置运行docker-compose up时,Compose在shell中查找POSTGRES_VERSION环境变量,并将其值替换为。对于本例,Compose在运行配置之前将映像解析为Postgres:9.3。
如果未设置环境变量,则Compose将替换为空字符串。在上面的示例中,如果没有设置POSTGRES_VERSION,则image选项的值为postgres:。
同时支持$VARIABLE和${VARIABLE}语法。不支持扩展的shell样式功能,如${VARIABLE-default}和${variable/foo/bar}。
如果您需要在配置值中放入文字美元符号,请使用双美元符号($$)。
我相信这个特性是在这个请求中添加的:https://github.com/docker/compose/pull/1765
我注意到人们对Docker的环境变量支持有问题。与其在Docker中处理环境变量,让我们回到基础,比如bash!下面是一个使用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语法在compose文件中引用env变量(即${SECRET_KEY}
插入.env
文件中的SECRET_KEY
)。
注compose_config
在我的.env
文件中定义,并在我的bash脚本中使用,但是您可以轻松地将{$compose_config}
替换为bash脚本中的my-compose-file.yml
。
还要注意,我通过用“MyProject”前缀命名我的所有容器来标记这个部署。您可以使用任何您想要的名称,但它有助于识别您的容器,以便您可以方便地在以后引用它们。假设容器应该是无状态的,这个脚本将根据。env文件参数和compose YAML文件快速删除和重新部署容器。
更新由于这个答案似乎很受欢迎,我写了一篇博客文章,更深入地描述了我的Docker部署工作流:http://lukeswart.net/2016/03/lets-deploy-part-1/当您为部署配置添加更多复杂性时,如nginx配置、LetsEncrypt证书和链接容器,这可能会有所帮助。
问题内容: 如果设置了环境变量,请说,然后在连接到固定字符串的入口点脚本中使用它,例如: 与作为环境varible的价值,我该怎么办呢?我尝试使用,但这似乎不起作用,因为它确实是正确的。 问题答案: 您正在使用ENTRYPOINT 的 exec形式 。与 shell表单 不同, exec表单 不会调用命令shell。这意味着正常的外壳处理不会发生。例如,将不会在$ HOME上进行变量替换。如果要进
卷值不允许附加属性('${VOLUME_NAME}‘意外) 任何帮助都将不胜感激。
我希望能够在docker compose中使用env变量。yml,值在docker compose up时传入。这就是一个例子。 我今天用基本的docker run命令来做这件事,它包含在我自己的脚本中。有没有一种方法可以在没有任何bash包装器的情况下用compose实现它?
问题内容: 我希望能够在docker-compose.yml中使用env变量,并在docker-compose时传入值。这就是例子。我今天使用基本的docker run命令来执行此操作,该命令包装在我自己的脚本中。没有任何这样的bash包装器,有没有办法通过compose实现它? 问题答案: 创建一个,这是您的with环境变量。 假设您的环境变量在文件“ env.sh”中 将以下代码放入sh文件中
问题内容: 是否可以重用在多个容器之间共享的环境变量以避免重复,如本示例所示: 问题答案: 该选项可能是好的,但它不支持在撰写文件。其他走的方式是: 扩展名字段(撰写文件3.4+) 如果可以使用3.4+组成文件,则扩展名字段可能是最佳选择: docker-compose.yml env_file指令 docker-compose.yml variables.env * 项目根目录中的 *.env
当我用它以以下错误停止: 我不是舒尔,但似乎。env文件不支持变量的使用。