【问题标题】:How to access build args in ENTRYPOINT dockerfile如何访问 ENTRYPOINT dockerfile 中的构建参数
【发布时间】:2019-12-05 15:02:11
【问题描述】:

我正在尝试基于 payara dockerimage 在 payara micro 中部署一个应用程序,并且我需要在 ENTRYPOINT 中传递一个参数快照版本(基本上我想访问 ENTRYFORM 中的构建参数)exec 形式,因为 ENTRYPOINT 的 exec 形式是首选:我的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

注释的 ENTRYPOINT 不起作用。容器日志显示部署无效。我在这里想念什么?另外,我该如何使用 CMD。谁能发个例子。

【问题讨论】:

    标签: docker dockerfile docker-entrypoint payara-micro


    【解决方案1】:

    注释行不起作用,因为它是ENTRYPOINTexec 形式,它不会调用shell (/bin/sh -c),因此不会发生变量替换。

    如果你想使用 exec 表单和环境变量,你需要直接指定它:

        ENTRYPOINT ["sh", "-c", "your command with env variable"]
    

    关于如何使用CMD 的问题,例如这样:

        ENTRYPOINT ["sh", "-c"]
        CMD ["your command with env variable"]
    

    您提到,您想在ENTRYPOINT 指令中使用构建参数。这实际上是不可能的,因为ARGENV 都没有在ENTRYPOINTCMD 中扩展:https://docs.docker.com/engine/reference/builder/#environment-replacementhttps://docs.docker.com/engine/reference/builder/#scope

    您还可以查看 great page with best practices 专门编写 Dockerfile 和 ENTRYPOINT 指令。

    【讨论】:

    • 如果您这样做,请跳过 ENTRYPOINT 并使用 CMD your command etc 而不使用 JSON 引用。 (使用 ENTRYPOINT 设置在您的图像上尝试 docker run ... ls -lrt /。)
    【解决方案2】:

    两个相辅相成的建议:

    如果您要将文件COPYing 到图像中,则可以在图像中为其指定一个固定名称。这样就避免了这个问题。

    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 变量替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2022-10-04
      • 2015-04-18
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多