【问题标题】:Environment variable substitution doesn't work in docker-compose file环境变量替换在 docker-compose 文件中不起作用
【发布时间】:2020-12-10 04:11:40
【问题描述】:

想象一下我们有这样的 .env 文件:

VAR_A=300
VAR_B=$(($VAR_A/100))

VAR_MEM=$((50*$VAR_B))M

我的 docker-compose 文件是这样使用它的:

my-service:
  environment:
    SOME_CACHE_VAR: ${VAR_MEM:-100M}

当我运行 docker-compose 时,它​​给了我一个错误:

docker.errors.DockerException: Failed converting the string value for memory ($((50*$VAR_B))) to an integer.

所以,它似乎根本不能替代变量。那我该怎么做呢?

【问题讨论】:

  • 你认为$((xxx))dollar-double-parentheses 语法在 docker-compose .env 文件中的作用是什么? (因为我很确定它不会像您想/希望的那样做。)
  • (( ... ))bash 的东西。据我所知,不是docker environment replacement
  • @Wyck 好吧,是的,你是对的。问题是我只是想表明我正在尝试以某种方式做到这一点并且它不起作用(因为我做错了)并且我想知道如何正确地做到这一点,如果可能的话。 $(())、${} 和 $() 都不起作用。
  • 我正在尝试类似于/bin/bash -c "SOME_CACHE_VAR=((100)) my-service" 的东西,但我还没有完全掌握语法。但我正在探索的策略是用 bash 命令替换 service 命令,该命令执行替换然后运行服务。也许其他人可以在我之前弄清楚。
  • 顺便说一句,VAR_B = ${VAR_A}“工作”只要这是正确的替换语法。它只是不做算术。您只会得到 substitutionconcatenation 以及 ${variable:-word}${variable:+word} 结构。

标签: docker docker-compose environment-variables


【解决方案1】:

如果实际计算是固定的并且只有一个可配置的值,您可以在容器内进行计算,而不是尝试在 Compose 级别进行设置。编写一个 shell 脚本来计算这些值,然后启动主容器进程:

#!/bin/sh
if [ -n "$VAR_A" ]; then
  VAR_B=$(($VAR_A/100))
  SOME_CACHE_VAR=$((50*$VAR_B))M
else
  SOME_CACHE_VAR=100M
fi
export SOME_CACHE_VAR
exec "$@"

将此脚本复制到您的图像中,并使其成为图像的入口点。

COPY entrypoint.sh ./
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD (as before)

现在,当您运行容器时,您需要提供$VAR_A,但不需要提供任何派生变量。图片的 CMD 或您使用 Compose command: 覆盖的任何内容都将在正确计算 $SOME_CACHE_VAR 的情况下运行。

docker run --rm -e VAR_A=1000 my-image sh -c 'echo $SOME_CACHE_VAR'
# Should print "500M"

计算的值在docker inspectdocker exec 等调试工具中将不可见,但主容器进程仍会看到它。

如果您根本无法更改图像,您还可以配置 Compose 以传递来自主机环境的值

my-service:
  environment:
    - SOME_CACHE_VAR

您可以在调用 Compose 之前运行完全相同的脚本来计算值。

./entrypoint.sh docker-compose up

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2016-12-23
    • 1970-01-01
    • 2015-05-29
    • 2022-06-24
    • 2019-11-01
    相关资源
    最近更新 更多