Bash 如何根据另一个变量的值更新dockerfile中的变量?
在将变量发送到Bash 如何根据另一个变量的值更新dockerfile中的变量?,bash,docker,docker-compose,command-line-interface,Bash,Docker,Docker Compose,Command Line Interface,在将变量发送到JAVA-server命令之前,我需要更新我的JAVA_ARGS变量 当用户调用/script/server-d时,我想附加调试参数。以下是我的/script/server的相关部分: for i in "$@" do case $i in -d|--debug) DEBUG_ARGS="--build-arg DEBUG_MODE=true" shift ;; -h|--help) display_usage exit
JAVA-server
命令之前,我需要更新我的JAVA_ARGS
变量
当用户调用/script/server-d
时,我想附加调试参数。以下是我的/script/server
的相关部分:
for i in "$@"
do
case $i in
-d|--debug)
DEBUG_ARGS="--build-arg DEBUG_MODE=true"
shift
;;
-h|--help)
display_usage
exit
;;
*)
echo "Unknown option"
exit 1
;;
esac
done
docker-compose build ${DEBUG_ARGS} app
docker-compose up
下面是我的docker compose.yml
services:
app:
environment:
...
JAVA_ARGS: -Xms2048m -Xmx3072m
JAVA_ARGS_DEBUG: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5080
这似乎有效,我认为我的dockerfile
正确地检测到DEBUG\u MODE=true
变量。这是我的dockerfile
:(有些东西被删除了)
我正确地看到调试模式打开。
输出到控制台
但随后echo“${JAVA_ARGS}”代码>为空。事实上,当它到达最后一行时,args不会传递给java
命令,调试也不会启用
我的bash非常不稳定,你知道为什么我不能在最后一个命令中更新和使用该var吗?你应该在运行时配置这些选项,而不是尝试在Docker映像中“烘焙”设置。(如果映像具有3 GB的硬编码堆大小,我可以在只有1 GB RAM或64 GB的系统上运行它吗?)
Dockerfile会提示一个入口点脚本,这是一个放置类似设置的好地方。我们可能会将Dockerfile缩减为:
来自openjdk的:8-1
WORKDIR/app
复制app.jar docker-entrypoint.sh/
入口点“/app/docker ENTRYPOINT.sh”
CMD[“java”、“-jar”、“app.jar”]
然后entrypoint脚本可以根据命令行选项或环境变量做出决策:
#/垃圾箱/垃圾箱
如果[-n“$JAVA_OPTS”];然后
JAVA_OPTS=“-Xms2048m-Xmx3072m”
fi
如果[-n“$DEBUG_MODE”];然后
JAVA_OPTS=“$JAVA_OPTS-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5080”
fi
导出JAVA_选项
执行官“$@”
然后运行它:
docker run --rm -p127.0.0.1:5080:5080 -e DEBUG_MODE=yes myimage
您将运行相同的映像“用于调试”或“用于实际”;您不需要重新编译它,也不需要对如何设置变量做出docker build
时间决策
docker run --rm -p127.0.0.1:5080:5080 -e DEBUG_MODE=yes myimage