Как запустить Docker-контейнер с пользовательской переменной (построен с помощью Jenkins) - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь запустить Docker-контейнер, который использует maven для развертывания Java-приложения. Без использования Docker, я использую команду для развертывания: "java -jar app-v0.1.jar"

Поскольку версия моего приложения имеет тенденцию к изменению (app-v0.1, v0.2 ...), обычно я запускаю "java-jar * .jar " (всегда есть только 1 файл .jar в рабочей папке).Это работает локально.

Однако, похоже, это невозможно применить при сборке контейнера Docker.Вот мой dockerfile


ОТ openjdk: 8

WORKDIR / app

COPY * .jar.

CMD ["java", "-jar", "* .jar"]

EXPOSE 8181


Я могу создать образ докера из этого Dockerfile.Но когда я пытаюсь запустить контейнер, я всегда получаю ошибку : невозможно получить доступ к jarfile * .jar.

Я также пытался:

COPY target/*.jar.

RUN file = `find.-name "* .jar" -exec basename {} \; `

CMD [" java "," -jar "," $ {file} "]

, что возвращает Ошибка: невозможно получить доступ к jarfile $ {file}

Если я изменю "* .jar" на определенное имя, например

CMD ["java "," -jar "," app-v0.1.jar "]

все работает нормально.Но, очевидно, я не хочу менять свой Dockerfile каждый раз, когда в моем приложении происходит обновление кода.

Есть ли способ, которым я могу поместить переменные в Dockerfile, что-то вроде "

CMD [" java "," -jar "," $ {filename} .jar"]"?

(Если это поможет: я использую конвейер Jenkins для автоматизации процесса сборки докера)

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я рекомендую использовать многоэтапную сборку.

Ваш Dockerfile должен быть:

FROM maven:3.6.0-jdk-8 as build

ARG BUILD_PROFILE=prod

WORKDIR /apps

COPY . .
RUN mvn --activate-profiles ${BUILD_PROFILE} clean install

FROM openjdk:8-jre
COPY --from=build /apps/target/*.jar ./
COPY startup.sh ./

RUN chmod +x ./*.sh
ENTRYPOINT ["/startup.sh"]

И startup.sh:

#!/usr/bin/env bash
java -Dspring.profiles.active=${RUN_PROFILE} -jar /app*.jar

Таким образом, вытакже создайте свое приложение при сборке Docker.

ПРИМЕЧАНИЕ вы также можете использовать команду в файле startup.sh в качестве точки входа, но я считаю ее чище.

0 голосов
/ 23 мая 2019

Решение 1:

Используйте ARG, см. this :

FROM openjdk:8

ARG filename
ENV jarname=${filename}

WORKDIR /app

COPY *.jar .

CMD java -jar ${jarname}

EXPOSE 8181

Использование docker build --build-arg filename=a.jar xxx

Решение 2:

Используйте ENV, см. this :

FROM openjdk:8

ENV jarname=""

WORKDIR /app

COPY *.jar .

CMD java -jar ${jarname}

EXPOSE 8181

Передать env для запуска контейнера docker run -e jarname=a.jar xxx

Решение 3:

заставить * работать в оболочке:

FROM openjdk:8

WORKDIR /app

COPY *.jar .

CMD java -jar *.jar

EXPOSE 8181
...