假设我们有这样的.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 inspect
或docker exec
(中不可见,但主容器进程仍会看到它
如果你根本无法更改图像,你也可以配置Compose来传递来自主机环境的值
my-service:
environment:
- SOME_CACHE_VAR
在调用Compose之前,您可以运行完全相同的脚本来计算值。
./entrypoint.sh docker-compose up