我正在尝试基于 payaradockerimage 在 payara micro 中部署一个应用程序,我需要在 ENTRYPOINT 中传递一个参数快照版本(基本上我想访问 ENTRYFORM 中的构建参数(exec 形式,因为首选 ENTRYPOINT 的执行形式: 我的 docker 文件如下:
FROM payara/micro:5.193.1
ARG snapshotversion
ENV snapshotvs=$snapshotversion
RUN jar xf payara-micro.jar
COPY /service/war/target/app-emailverification-service-war-${snapshotversion}.war ${DEPLOY_DIR}/
COPY ojdbc6.jar ${PAYARA_HOME}/
COPY --chown=payara domain.xml /opt/payara/MICRO-INF/domain/domain.xml
RUN cd /opt/payara/MICRO-INF/domain && ls -lrt
#ENTRYPOINT ["java", "-jar", "/opt/payara/payara-micro.jar", "--deploy", "/opt/payara/deployments/app-service-war-$snapshotvs.war", "--domainConfig", "/opt/payara/MICRO-INF/domain/domain.xml","--addLibs", "/opt/payara/ojdbc6.jar"]
ENTRYPOINT java -jar /opt/payara/payara-micro.jar --deploy /opt/payara/deployments/app-service-war-$snapshotvs.war --domainConfig /opt/payara/MICRO-INF/domain/domain.xml --addLibs /opt/payara/ojdbc6.jar
注释的入口点不起作用。容器日志显示部署无效。我在这里错过了什么?另外,我如何使用CMD。有人可以发布示例吗?
注释行不起作用,因为它是ENTRYPOINT
的exec形式,它不调用shell(/bin/sh -c
(,所以变量替换不会发生。
如果要使用exec表单和环境变量,则需要直接指定它:
ENTRYPOINT ["sh", "-c", "your command with env variable"]
对于您关于如何使用CMD
的问题,例如:
ENTRYPOINT ["sh", "-c"]
CMD ["your command with env variable"]
您提到,您想在ENTRYPOINT
指令中使用构建参数。这实际上是不可能的,因为ARG
和ENV
都没有在ENTRYPOINT
或CMD
中扩展:https://docs.docker.com/engine/reference/builder/#environment-replacement,https://docs.docker.com/engine/reference/builder/#scope
你也可以看看伟大的页面,其中包含编写Dockerfile的最佳实践和ENTRYPOINT
说明。
两个相辅相成的建议:
如果要将文件COPY
到映像中,则可以在映像中为其指定固定名称。 这样可以避免此问题。
WORKDIR /opt/payara
COPY service/war/target/app-emailverification-service-war-${snapshotversion}.war deployments/app-service.war
如果你有一个特别长或涉及的命令,你试图使它成为主要的容器进程,请将其包装在 shell 脚本中。 您需要确保exec
主容器进程,以避免在信号处理方面遇到一些麻烦(导致docker stop
暂停 10 秒,然后硬终止您的实际进程(。
#!/bin/sh
exec java
-jar /opt/payara/payara-micro.jar
--deploy /opt/payara/deployments/app-service.war
--domainConfig /opt/payara/MICRO-INF/domain/domain.xml
--addLibs /opt/payara/ojdbc6.jar
COPY launch.sh ./
RUN chmod +x launch.sh
CMD ["/opt/payara/launch.sh"]
在第二种情况下,它是一个 shell 脚本,因此您可以使用普通的 shell 变量替换。