Я хочу создать образ докера, используя исходники 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