Условная обработка Docker

Я не могу заставить работать условный 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

но он ведет себя так, как будто переменная не установлена. Билдкит отключен. Что я могу сделать, чтобы заставить его работать?

Попробуйте = вместо ==. Или используйте двойные скобки [[ … ]].

Joe 18.04.2023 21:49

В вашем примере с многоэтапной сборкой вам все еще нужно ARG APP_BRANCH

dsax7 18.04.2023 22:24

Вы уверены, что используете alpine:latest, а не Ubuntu?

KamilCuk 18.04.2023 22:56

@dsax7 - Конечно. Первый кусок кода используется в каждом подходе.

Smok 19.04.2023 09:07

@KamilCuk - Хороший намек! На самом деле я использовал apline:latest в домашней лаборатории для тестирования и забыл, что в рабочей среде используется openjdk:11-jre-slim на основе Debian. Теперь тесты более последовательны :) Это фиксированная часть моего вопроса, и я отредактирую ее, чтобы отразить ее.

Smok 19.04.2023 13:19
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
5
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не могу воспроизвести вашу проблему.

Со следующим 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). В альпийском это работает, как вы упомянули.

Smok 19.04.2023 14:37

Сообщение об ошибке выглядит как из тире. == — нестандартный аргумент для [. = является стандартным. Используйте [ "${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), и описанным выше типом оболочки. Команда оболочки не заключена в квадратные скобки и кавычки.

Другие вопросы по теме