java - 无法在 Docker 入口点命令中使用变量

标签 java docker dockerfile

我正在尝试构建一个 dockerfile。我早些时候尝试为我的项目使用硬编码路径并且输出很好。但是,一旦我开始使用变量,java 代码就停止执行。

jetty 文件

FROM java:7
EXPOSE 7100

ARG version
ENV version=$version
RUN echo $version

RUN mkdir -p /cacheDir/services/live/prediction/p7100/$version/logs
RUN ls -tlr /cacheDir/services/live/prediction/p7100/

RUN mkdir -p /cacheDir/services/releases/prediction/p7100/$version/

RUN mkdir -p /cacheDir/services/predictionmodel
ADD target/predictionDependencies/star /cacheDir/services/predictionmodel/ #star here is the operator (*), it was being interpret as comments by this stackoverflow editor. 

ADD /target/prediction-0.0.13-SNAPSHOT.jar /cacheDir/services/releases/prediction/p7100/$version/prediction-0.0.13-SNAPSHOT.jar

ADD /target/instance.properties /cacheDir/services/releases/prediction/p7100/$version/instance.properties

ADD /target/logback.xml /cacheDir/services/releases/prediction/p7100/$version/logback.xml

RUN ls -ltr /cacheDir/services/live/prediction/p7100/$version/
RUN ls -ltr /cacheDir/services/releases/prediction/p7100/$version/
RUN ls -ltr /cacheDir/services/predictionmodel

ENTRYPOINT java -server -Xmx2g -Xloggc:/cacheDir/services/live/prediction/p7100/$version/logs/gc.log -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/cacheDir/services/live/prediction/p7100/$version/oom.dump -Dlogback.configurationFile=/cacheDir/services/releases/prediction/p7100/$version/logback.xml -Dlog.home=/cacheDir/services/live/prediction/p7100/$version/logs -Dlogback.debug=true -Dbroker.l^Ct=sv-kafka6.pv.sv.nextag.com:9092,sv-kafka7.pv.sv.nextag.com:9092,sv-kafka8.pv.sv.nextag.com:9092,sv-kafka9.pv.sv.nextag.com:9092 -jar /cacheDir/services/releases/prediction/p7100/$version/prediction-0.0.13-SNAPSHOT.jar 7100 /cacheDir/services/releases/prediction/p7100/$version/instance.properties /com/wizecommerce/services/qa &

用于构建镜像的命令。

docker build --build-arg version=0.0.14-SNAPSHOT -t prediction:0.0.14-SNAPSHOT .

图像似乎成功了。但是,当我运行命令时,容器会自行退出。使用的运行命令:

docker run -p 7100:7100 -v ~/PredictionVolume/logs/:/cacheDir/services/live/prediction/p7100/0.0.14-SNAPSHOT/logs/  -t prediction:0.0.14-SNAPSHOT

当试图查看正在运行的容器时,它没有运行。

我尝试使用我发现的这些拖曳解决方案,但似乎都没有用。

How do I use Docker environment variable in ENTRYPOINT array?

其他解决方案是我用这个命令替换了以下 ENTRYPOINT 命令。

ENTRYPOINT ["sh","-c","java","-server","-Xmx2g","-Xloggc:/cacheDir/services/live/prediction/p7100/${version}/logs/gc.log","-verbose:gc","-XX:+PrintGCDateStamps","-XX:+PrintGCDetails","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/cacheDir/services/live/prediction/p7100/${version}/oom.dump","-Dlogback.configurationFile=/cacheDir/services/releases/prediction/p7100/${version}/logback.xml","-Dlog.home=/cacheDir/services/live/prediction/p7100/${version}/logs","-Dlogback.debug=true","-Dbroker.l^Ct=sv-kafka6.pv.sv.nextag.com:9092,sv-kafka7.pv.sv.nextag.com:9092,sv-kafka8.pv.sv.nextag.com:9092,sv-kafka9.pv.sv.nextag.com:9092","-jar","/cacheDir/services/releases/prediction/p7100/${version}/prediction-0.0.13-SNAPSHOT.jar","7100","/cacheDir/services/releases/prediction/p7100/${version}/instance.properties","/com/wizecommerce/services/qa","&"]

但是使用此命令,如果您在终端上键入 java,则显示所有可用选项的输出将显示在屏幕(终端)上。

有人可以建议出路吗? 谢谢!!!

最佳答案

试试这个:

ENTRYPOINT ["sh","-c","java -server -Xmx2g ..."]

当您使用 sh -c 时,它需要一个单个 参数作为要运行的命令,参数之间用空格分隔,就像您在命令行。您当前仅运行 java 并将一堆额外的不适当参数传递给 sh

此外,去掉末尾的 & 符号 & - 你不想尝试将进程置于后台。

关于java - 无法在 Docker 入口点命令中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248163/

相关文章:

java - Super() 关键字...它可以用来调用多个父类(super class)的构造函数吗?

java - 下载并覆盖功能

angular - Angular + Kubernetes + Nginx上的路由问题

docker - Dockerfile 中的 FROM...AS 没有按我预期的那样工作

docker - Teradata 数据库 Docker 镜像

java - imageJ 插件参数

java - 为什么排序方法是 Collections 而不是 AbstractList 的一部分?

docker - docker镜像的虚拟大小是什么意思?

php - 500(内部服务器错误)与 Laravel 和 Docker

docker - 如何将Sample Logstash docker 容器链接到Elastics网站上的Sample Elasticsearch集群?