Как получить доступ к аргументам сборки в файле докеров ENTRYPOINT

Я пытаюсь развернуть приложение в Payara Micro на основе изображения докеров payara, и мне нужно передать одну версию моментального снимка аргумента в ENTRYPOINT (в основном я хочу получить доступ к аргументам сборки в ENTRYFORM) в форме exec, поскольку предпочтительна форма exec ENTRYPOINT: мой файл докеров как следует:

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 с этим. Может кто-нибудь выложить пример.


person MiGo    schedule 05.12.2019    source источник


Ответы (2)


Прокомментированная строка не работает, потому что это форма exec для ENTRYPOINT, которая не вызывает оболочку (/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 инструкций.

person uraji    schedule 05.12.2019
comment
В этом случае пропустите ENTRYPOINT и используйте CMD your command etc без кавычек JSON. (Попробуйте docker run ... ls -lrt / на своем изображении с этой ENTRYPOINT настройкой.) - person David Maze; 06.12.2019

Два предложения, которые дополняют друг друга:

Если вы COPY вставляете файл в изображение, вы можете дать ему фиксированное имя внутри изображения. Это позволяет избежать этой проблемы.

WORKDIR /opt/payara
COPY service/war/target/app-emailverification-service-war-${snapshotversion}.war deployments/app-service.war

Если у вас есть особенно длинная или сложная команда, которую вы пытаетесь сделать основным процессом контейнера, оберните ее в сценарий оболочки. Вы хотите убедиться, что 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"]

Во втором случае это сценарий оболочки, поэтому вы можете использовать обычные замены переменных оболочки.

person David Maze    schedule 06.12.2019