当前位置: 首页 > 知识库问答 >
问题:

如何在docker组合中使用环境变量

曹光霁
2023-03-14

我希望能够在docker-compose.yml中使用env变量,这些变量的值是在docker-compose up时传入的。这就是例子。

我今天用基本的docker run命令来完成这个任务,它被包装在我自己的脚本中。有没有一种方法可以用compose来实现它,而不需要任何这样的bash包装器?

proxy:
  hostname: $hostname
  volumes:
    - /mnt/data/logs/$hostname:/logs
    - /mnt/data/$hostname:/data

共有1个答案

楚冷勋
2023-03-14

看起来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文件不支持变量的使用。