Используйте один dockerfile для сборки из двух разных источников - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу создать образ докера, используя исходники git или уже созданное приложение.Я создал два Docker-файла, таких как эти (примечание: это псевдокод):

Runtime-Image:

FROM <baseimage>
EXPOSE 1234/tcp
EXPOSE 4321/tcp
VOLUME /foobar
COPY myapp.tgz .
RUN tar -xzf myapp.tgz && rm -f myapp.tgz
ENTRYPOINT ["myapp"]

myapp.tgz создается на сервере сборки или, возможно, компилируется вручную.Он доступен на хост-сервере докера локально.

Для сборки непосредственно из исходного кода я использую:

FROM <devimage> AS buildenv
ARG GIT_USER
ARG GIT_PASSWORD
RUN    git clone http://${GIT_USER}:${GIT_PASSWORD}@<my.git.host>
RUN    ./makefile && cp /source/build/myapp.tgz /drop/myapp.tgz

FROM <baseimage> AS runenv
EXPOSE 1234/tcp
EXPOSE 4321/tcp
VOLUME /foobar
COPY --from=buildenv /drop/myapp.tgz .
RUN tar -xzf myapp.tgz && rm -f myapp.tgz
ENTRYPOINT ["myapp"]

Инструкции на втором этапе сборки, очевидно, являются duplicate из файла Docker Runtime-Image.

Мне бы хотелось иметь ОДИН Dockerfile, который может быть собран из источника или из контекста на хосте докера, как требуется.Я мог бы поместить дублированные команды в пользовательский базовый образ и использовать его для построения (FROM), но это запутало бы Dockerfile.

Какой рекомендуемый, самый элегантный способ сделать это?

  • Я не могу использовать привязку, чтобы получить myapp.tgz в текущем каталоге на хосте докера, могу ли я?Для этого мне нужно было бы запустить Container для создания моего приложения?
  • В Dockfile нет директивы IF для условий?
  • Если наDocker host, COPY myapp.tgz . не удастся
  • Если нет buildenv, COPY --from=buildenv /drop/myapp.tgz . не удастся.

Я мог бы использовать COPY ./* . и затем проверить с помощью

[ -f /myapp.tgz ] && <prepare-container> || <build-from-git-source>

Думаю?Мы бы предпочли просто создать отдельный Dockerfile только для сборки из исходного кода, а затем использовать что-то вроде

docker run --rm -v /SomewhereOnHost/drop:/drop my-compile-image

1 Ответ

0 голосов
/ 30 ноября 2018

Последние 2 дня я пытался это выяснить, теперь у меня есть хорошее решение для создания условной сборки (if в Dockerfile)

ARG mode=local

FROM alpine as build_local 
ONBUILD COPY myapp.tgz .

FROM alpine as build_remote
ONBUILD RUN git clone GIT_URL
ONBUILD RUN cd repo && ./makefile && cp /source/build/myapp.tgz .

FROM build_${mode} AS runenv
EXPOSE 1234/tcp
EXPOSE 4321/tcp
VOLUME /foobar
RUN tar -xzf myapp.tgz && rm -f myapp.tgz
ENTRYPOINT ["myapp"]

Верхний уровень modeпозволяет передать условие с docker build --build-arg mode=remote ..ONBUILD используется, поэтому команда выполняется, только если выбрана соответствующая ветвь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...