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