码头工人解决方案:
看起来 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 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
BASH 解决方案:
我注意到人们对 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}
中插入)。SECRET_KEY
.env
请注意,COMPOSE_CONFIG
在我的文件中定义.env
并在我的 bash 脚本中使用,但您可以轻松地{$COMPOSE_CONFIG}
用my-compose-file.yml
bash 脚本中的替换。
另请注意,我通过使用“myproject”前缀命名所有容器来标记此部署。您可以使用任何您想要的名称,但它有助于识别您的容器,以便您以后可以轻松地引用它们。假设您的容器应该是无状态的,该脚本将根据您的 .env 文件参数和您的 compose YAML 文件快速删除和重新部署您的容器。
更新
由于这个答案似乎很受欢迎,我写了一篇博客文章,更深入地描述了我的 Docker 部署工作流程:http: //lukeswart.net/2016/03/lets-deploy-part-1/这在您添加时可能会有所帮助部署配置更加复杂,例如 nginx 配置、LetsEncrypt 证书和链接容器。