Безусловно, лучший способ сделать это - клонировать репозиторий на хост-компьютере. Часто вы можете зафиксировать Dockerfile
и docker-compose.yml
в хранилище, и тогда все будет в одном месте.
git clone git@github.com:example/example
cd example
docker-compose up --build
Запуск git clone
в Dockerfile имеет несколько основных проблем. Стандартное кэширование слоя docker build
пропустит команду, которая, по его мнению, уже запущена, поэтому вы склонны пропускать текущие коммиты. Вы можете очень разумно захотеть создать образ, основанный на незафиксированном коде или на ветке, который трудно выразить во внешнем Dockerfile. Но самая большая проблема - учетные данные.
Указанный вами путь не будет работать, поскольку строки build:
и volumes:
рассматриваются в два отдельных этапа. Вы должны использовать многоэтапную сборку, чтобы иметь возможность проверять хранилище, но не передавать учетные данные другим людям, которые могут получить копию вашего изображения. Это может выглядеть примерно так:
FROM ubuntu:18.04 AS checkout
ARG commit=master
RUN apt-get update \
&& apt-get install --assume-yes --no-install-recommends \
git-core \
openssh-client
COPY .ssh /root/.ssh
RUN chmod 0400 /root/.ssh/*
WORKDIR /app
RUN git clone git@github.com:example/example \
&& cd example \
&& git checkout $commit
FROM something
WORKDIR /app
COPY --from=checkout /app/example .
...
Даже в этом случае вам нужна пара ключей ssh в локальном каталоге сборки (которую вам придется скопировать вручную), и вы должны быть осторожны, чтобы не случайно COPY
это в окончательное изображение.