首页 > 解决方案 > 环境变量替换在 docker-compose 文件中不起作用

问题描述

想象一下我们有这样的 .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.

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

标签: dockerdocker-composeenvironment-variables

解决方案


如果实际计算是固定的并且只有一个可配置值,您可以在容器内进行计算,而不是尝试在 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 inspect计算值在or等​​调试工具中不可见docker exec,但主容器进程仍会看到它。

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

my-service:
  environment:
    - SOME_CACHE_VAR

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

./entrypoint.sh docker-compose up

推荐阅读