环境变量替换在 docker 撰写文件中不起作用



假设我们有这样的.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.

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

如果实际计算是固定的,并且只有一个可配置的值,则可以在容器内进行计算,而不是尝试在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或使用Composecommand:覆盖的任何内容都将在正确计算$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

最新更新