Я не могу заставить работать условный Dockerfile.
Моя команда: docker build -t test --progress=plain --build-arg APP_BRANCH=main
.
FROM alpine:latest AS base
ARG APP_BRANCH
Я пробовал использовать простой if...else:
RUN\
if [ "${APP_BRANCH}" == "main" ];\
then echo "MAIN app";\
elif [ "${APP_BRANCH}" == "dev" ];\
then echo "DEV app";\
else echo "Something else!!";\
fi
и я получаю что-то вроде
/bin/sh: 1: [: main: unexpected operator
исправлено
просто чтобы увидеть, установлена ли переменная. И это.
Затем я попытался использовать сборку MultiStage:
FROM base AS main
RUN echo "MAIN"
FROM base AS prod
RUN echo "PROD"
FROM ${APP_BRANCH} AS final
RUN echo "FINAL"
и получил вывод: base name (${APP_BRANCH}) should not be blank
Я также пытался использовать переменную ${APP_BRANCH} в точке входа.
ENTRYPOINT ["java", "-jar", "/usr/share/myapp/myAppName-${APP_BRANCH}.jar
но он ведет себя так, как будто переменная не установлена. Билдкит отключен. Что я могу сделать, чтобы заставить его работать?
В вашем примере с многоэтапной сборкой вам все еще нужно ARG APP_BRANCH
Вы уверены, что используете alpine:latest
, а не Ubuntu?
@dsax7 - Конечно. Первый кусок кода используется в каждом подходе.
@KamilCuk - Хороший намек! На самом деле я использовал apline:latest в домашней лаборатории для тестирования и забыл, что в рабочей среде используется openjdk:11-jre-slim на основе Debian. Теперь тесты более последовательны :) Это фиксированная часть моего вопроса, и я отредактирую ее, чтобы отразить ее.
Я не могу воспроизвести вашу проблему.
Со следующим Dockerfile
FROM alpine:latest
ARG APP_BRANCH
RUN\
if [ "${APP_BRANCH}" == "main" ];\
then echo "MAIN app";\
elif [ "${APP_BRANCH}" == "dev" ];\
then echo "DEV app";\
else echo "Something else!!";\
fi
и эта команда сборки
docker build --no-cache --build-arg APP_BRANCH=main . --progress=plain
он успешно строится и показывает MAIN app
в выводе сборки.
Это на хосте Ubuntu 20.04 и Docker 23.0.1.
Если у вас все еще есть проблема, отредактируйте свое сообщение, включив в него полный файл Dockerfile и точную команду, которую вы используете для его создания.
Эта часть вопроса была связана с базовым изображением, которое я использовал. Моя ошибка заключалась в том, что я использовал другой образ в своей домашней лаборатории, чем на работе (Alpine ведет себя иначе, чем на основе Debian). В альпийском это работает, как вы упомянули.
Сообщение об ошибке выглядит как из тире. ==
— нестандартный аргумент для [
. =
является стандартным. Используйте [ "${APP_BRANCH}" = "main" ]
.
Главной проблемой в этом случае была ENTRYPOINT. Как это описано здесь: https://emmer.dev/blog/docker-shell-vs.-exec-form/ и здесь: https://engineering.pipefy.com/2021/07/30/1-docker-bits-shell-vs-exec/ ENTRYPOINT немного сложнее. Он принимает две формы: exec или shell. Форма Exec не заменяет переменные. Форма оболочки заменяет переменные ENV и больше подходит для этого случая. Пример кода может быть таким:
ARG APP_BRANCH
ENV APP_BRANCH=${APP_BRANCH}
ENTRYPOINT java -jar /usr/share/myapp/myAppName-$APP_BRANCH.jar
Обратите внимание, как переменная APP_BRACH регистрируется в первой строке, назначается переменной ENV с тем же именем во второй строке, а затем используется в точке входа типа оболочки. Также обратите внимание на различия между ENTRYPOINT, описанным ранее (тип exec), и описанным выше типом оболочки. Команда оболочки не заключена в квадратные скобки и кавычки.
Попробуйте
=
вместо==
. Или используйте двойные скобки[[ … ]]
.