Как настроить различные файлы докеров для разработки и производства

Я использую докер для разработки и производства для проекта laravel. У меня есть немного другой докер файл для разработки и производства. Например, я монтирую локальный каталог в контейнер докеров в среде разработки, поэтому мне не нужно делать сборку докеров для каждого изменения кода.

Поскольку смонтированный каталог будет доступен только при запуске контейнера докеров, я не могу поместить команды, такие как "установка композитора" или "npm install" в файл docker для разработки.

В настоящее время я управляю двумя файлами докеров, есть ли способ, которым я могу это сделать, с одним файлом докеров и решать, какие команды запускать при создании докеров, отправляя параметры.

То, что я пытаюсь достичь, - это

В файле докеров

...
IF PROD THEN RUN composer install
...

Во время сборки докеров

docker build [PROD] -t mytag .

Ответ 1

Вы можете использовать два разных файла Docker.

# ./Dockerfile (non production)
FROM foo/bar
MAINTAINER ...

# ....

И второй:

# ./Dockerfile.production
FROM foo/bar
MAINTAINER ...

RUN composer install

Вызывая команду сборки, вы можете указать, какой файл он должен использовать:

$> docker build -t mytag .
$> docker build -t mytag-production -f Dockerfile.production .

Ответ 2

В качестве лучшей практики вам следует попытаться использовать один файл Docker, чтобы избежать неожиданных ошибок между различными средами. Однако у вас может быть usecase, где вы не можете этого сделать.

Синтаксис Dockerfile недостаточно богат для поддержки такого сценария, однако вы можете использовать сценарии оболочки для достижения этого.

Создайте сценарий оболочки, который называется install.sh который делает что-то вроде:

if [ ${ENV} = "DEV" ]; then 
    composer install
else
    npm install
fi

В Dockerfile добавьте этот скрипт, а затем выполните его при создании

...
COPY install.sh install.sh
RUN chmod u+x install.sh && ./install.sh
...

При построении передать конструкцию arg для указания среды, например:

docker build --build-arg "ENV=PROD" ...

Ответ 3

Вы можете использовать build args напрямую, не предоставляя дополнительный скрипт sh. Однако может показаться немного грязным. Но это работает.

Файл Docker должен быть таким:

FROM alpine
ARG mode
RUN if [ "x$mode" = "xdev" ] ; then echo "Development" ; else echo "Production" ; fi

И команды для проверки:

docker build -t app --build-arg mode=dev .
docker build -t app --build-arg mode=prod .

Ответ 5

У меня есть некоторые методы, такие как docker-compose, многоэтапная передача, передача arg через файл и то, что они указали выше. Моя компания должна найти хороший способ сделать это, и я рассмотрел некоторые из методов, и здесь мое мнение

Лучший способ - передать аргумент через cmd, и вы можете также передать его через vscode, щелкнув правой кнопкой мыши и щелкнув по изображению сборки. Изображение кода Visual Studio при сборке кликов изображения и в коде как

ARG BuildMode
RUN echo $BuildMode
RUN if [ "$BuildMode" = "debug" ] ; then apt-get update \
    && apt-get install -y --no-install-recommends \
       unzip \
    && rm -rf /var/lib/apt/lists/* \
    && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg ; fi

и в разделе сборки dockerfile

ARG BuildMode
ENV Environment=${BuildMode:-debug}
RUN dotnet build "debugging.csproj" -c $Environment -o /app

FROM build AS publish
RUN dotnet publish "debugging.csproj" -c $Environment -o /app