docker-compose 使用列表、映射或数组值进行变量替换/插值

dus*_*ltz 4 docker docker-compose

如何对docker-compose.yml文件中的列表、映射或数组值使用变量替换。

例如:

graylog:
  image: graylog2/server2
  extra_hosts: ${EXTRA_HOSTS}
Run Code Online (Sandbox Code Playgroud)

export EXTRA_HOSTS="['host1:10.10.10.1','host2:10.10.10.2']"
Run Code Online (Sandbox Code Playgroud)

给出以下错误:graylog.extra_hosts must be a mapping

我尝试过上述的不同变体,但没有成功。

我确实看到这里有一个关于此的未决问题:https ://github.com/docker/compose/issues/4249

难道这就是不可能吗?有谁知道解决方法?

dus*_*ltz 5

至少截至目前(2018年6月),Docker仍然不支持这一点。我能够利用 解决这个问题envsubst

envsubst是 的一部分gettext,并且它只能用于替换您告诉它的环境变量。

调整该docker-compose.yml值,使其看起来像数组或映射(方括号或大括号),但将该值设置为环境变量。

例如

graylog:
  image: graylog2/server2
  extra_hosts: [ ${EXTRA_HOSTS} ]
Run Code Online (Sandbox Code Playgroud)

然后,定义不带方括号或大括号的环境变量。

例如:

export EXTRA_HOSTS="'host1:10.10.10.1','host2:10.10.10.2'"
Run Code Online (Sandbox Code Playgroud)

然后利用envsubst

envsubst '${EXTRA_HOSTS}' < docker-compose.yml > docker-compose.subst.yml && docker stack deploy -c docker-compose.subst.yaml foobar
Run Code Online (Sandbox Code Playgroud)

请注意,您传递'${EXTRA_HOSTS}'envsubst. 这告诉它只替换这个环境变量。这可确保它不会意外替换使用 Docker 撰写文件的变量替换语法的其他变量。

  • 有关此功能的任何消息而无需使用 envsubst? (2认同)