我希望能够在docker-compose.yml中使用env变量,并在docker-compose时传入值 . 这是一个例子 . 今天我正在使用基本的docker run命令执行此操作,该命令包含在我自己的脚本中 . 有没有办法用compose实现它,没有任何这样的bash包装器?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
11 回答
创建
template.yml
,这是带有环境变量的docker-compose.yml
.假设您的环境变量位于文件中'env.sh'
将下面的代码放在sh文件中并运行它 .
将使用正确的环境变量值生成新文件
docker-compose.yml
.示例template.yml文件:
示例env.sh文件:
DOCKER解决方案:
看起来像docker-compose 1.5已启用变量替换:https://github.com/docker/compose/releases
最新的Docker Compose允许您从撰写文件中访问环境变量 . 因此,您可以获取环境变量,然后运行Compose,如下所示:
然后你可以使用$ 在docker-compose.yml中引用变量,如下所示:
以下是来自文档的更多信息,请点击此处:https://docs.docker.com/compose/compose-file/#variable-substitution
我相信此拉取请求中添加了此功能:https://github.com/docker/compose/pull/1765
BASH解决方案:
我注意到人们对Docker的问题's environment variables support. Instead of dealing with environment variables in Docker, let' s回归基础知识,比如bash!这是一个使用bash脚本和
.env
文件的更灵活的方法 .一个示例.env文件:
然后在同一目录中运行此bash脚本,该目录应正确部署所有内容:
只需使用通常的bash语法引用你的compose文件中的env变量(即
${SECRET_KEY}
从.env
文件中插入SECRET_KEY
) .注意
COMPOSE_CONFIG
在我的.env
文件中定义并在我的bash脚本中使用,但您可以轻松地将{$COMPOSE_CONFIG}
替换为bash脚本中的my-compose-file.yml
.另请注意,我通过使用“myproject”前缀命名所有容器来标记此部署 . 您可以使用任何您想要的名称,但它有助于识别您的容器,以便您以后轻松引用它们 . 假设您的容器是无状态的,就像它们应该的那样,此脚本将根据您的.env文件参数和您的撰写YAML文件快速删除和重新部署容器 .
Update 由于这个答案看起来很流行,我写了一篇博文,更深入地描述了我的Docker部署工作流程:http://lukeswart.net/2016/03/lets-deploy-part-1/当您为部署配置添加更多复杂性时,这可能会有所帮助,例如nginx配置,LetsEncrypt证书和链接容器 .
似乎docker-compose现在支持default environment variables in file .
您需要做的就是在名为
.env
的文件中声明您的变量,它们将在docker-compose.yml中可用 .例如,对于包含内容的
.env
文件:您可以在
docker-compose.yml
中访问您的变量或将它们转发到容器中:为所需的卷使用环境变量时:
docker-compose.yaml
文件的同一文件夹中创建.env文件在
.env
文件中docker-compose.yaml
文件中将$hostname
更改为${HOSTNAME}
当然,您可以在每个构建上动态地执行此操作,如:
最好的方法是在
docker-compose.yml
文件之外指定环境变量 . 您可以使用env_file
设置,并在同一行中定义您的环境文件 . 然后再做一个docker-compose up应该用新的环境变量重新创建容器 .这是我的docker-compose.yml的样子:
你还不能......但这是一个替代方案,像docker-composer.yml生成器一样思考:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
基本上是一个替换变量的shell脚本 . 您还可以使用Grunt任务在CI过程结束时构建docker compose文件 .
以下内容适用于docker-compose 3.x设置容器内的环境变量
在与docker-compose.yml相同的位置创建.env文件
你的撰写文件就像
source
我有一个简单的bash脚本我为此创建它只是意味着在使用前在你的文件上运行它:https://github.com/antonosmond/subber
基本上只需使用双花括号创建您的撰写文件来表示环境变量,例如:
双花括号中的任何内容都将替换为同名的环境变量,因此如果我设置了以下环境变量:
在运行
subber docker-compose.yml
时,生成的文件看起来像:据我所知,这是一项正在进行的工作 . 他们想要这样做,但它尚未发布 . 见1377(@Andy提到的"new" 495) .
我最终实现了@Thomas提出的“生成.yml作为CI的一部分”方法 .
将env添加到.env文件
如
然后将其保存到deploy.sh
使用.env文件在docker-compse.yml中定义动态值 . 无论是港口还是其他任何 Value .
示例docker-compose:
在.env文件中,您可以定义这些变量的值: