Стратегии Dockerfile для Git

Какова наилучшая стратегия клонирования частного репозитория Git в контейнер Docker с использованием файла Docker? За и против?

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

Это не описано в руководстве по лучшим практикам Dockerfile.

Ответ 1

У вас обычно есть два подхода:

  • ссылаясь на хранилище, где вы получаете свои секретные данные, необходимые для доступа к тому, что вам нужно поместить в свой образ (здесь ваши ключи ssh для доступа к вашему частному репо)

Обновление 2018: см. " Как сохранить секретные секреты вашего контейнера ", который включает:

  • Использование томов для передачи секретов в контейнер во время выполнения
  • У вас есть план поворота секретов
  • Убедитесь, что ваши секреты зашифрованы

  • или техника раздавливания (не рекомендуется, см. комментарий)

Второй подход см. В разделе " Вытягивание Git в изображение Docker без оставления ключей SSH "

  • Добавить закрытый ключ в файл Dockerfile
  • Добавьте его в ssh-agent
  • Запустите команды, требующие аутентификации SSH
  • Удалить закрытый ключ

Dockerfile:

ADD ~/.ssh/mykey /tmp/  
RUN ssh-agent /tmp  
# RUN bundle install or similar command
RUN rm /tmp/mykey  

Теперь создадим изображение:

$ docker build -t original .
  • Сквош слои:

    docker save original | sudo docker-squash -t squashed | docker load
    

Ответ 2

Я расскажу, что я нашел до сих пор.

Существуют разные стратегии получения исходного кода Git в сборке Docker. Многие из них имеют разные способы взаимодействия с механизмами кэширования Dockers и могут быть более или менее подходящими для вашего проекта и как вы собираетесь использовать Docker.

RUN git clone

Если вы похожи на меня, это тот подход, который сначала возникает, когда вы видите команды, доступные вам в файле Docker. Проблема в том, что он может взаимодействовать несколькими неинтуитивными способами с помощью механизмов кэширования Dockers. Например, если вы сделаете обновление в своем репозитории git, а затем заново запустите сборку докеров, у которой есть команда RUN git clone, вы можете или не можете получить новую фиксацию в зависимости от того, были ли отменены предыдущие команды Dockerfile кэш.

Один из способов обойти это - использовать docker build --no-cache, но тогда, если есть какие-то команды, требующие времени, предшествующие клону, они тоже будут запускаться снова.

Другая проблема заключается в том, что вы (или кто-то, у кого вы распространяли свой файл Dockerfile), могут неожиданно вернуться к сломанной сборке позже, когда обновляется обновленный репозиторий git.

Подход с двумя птицами и одним камнем к этому при использовании RUN git clone состоит в том, чтобы поместить его на одну строку1 с конкретной ревизией ревизии, например:

RUN git clone https://github.com/example/example.git && cd example && git checkout 0123abcdef

Затем обновление версии для проверки в Dockerfile приведет к недействительности кеша в этой строке и вызовет запуск клона/проверки.

Одним из возможных недостатков этого подхода в целом является то, что вы должны установить git в свой контейнер.

RUN curl или ADD URL-адрес тега/фиксации tarball

Это позволяет избежать необходимости установки git в вашей контейнерной среде и может извлечь выгоду из явного о том, когда кеш будет разорваться (т.е. Если тег/ревизия является частью URL-адреса, это изменение URL приведет к сбою кеша). Обратите внимание, что если вы используете команду Dockerfile ADD для копирования с удаленного URL-адреса, файл будет загружаться каждый раз при запуске сборки, а заголовок HTTP Last-Modified также будет использоваться для аннулирования кеша.

Вы можете увидеть этот подход, используемый в файле gokang docker.

Подмодули Git внутри репозитория Dockerfile

Если вы храните файлы Dockerfile и Docker в отдельном репозитории из исходного кода, или для сборки Docker требуется несколько исходных репозиториев, использование подмодулей git (или git-поддеревьев) в этом репозитории может быть допустимым способом получения исходных репозиториев в вашей сборке контекст. Это позволяет избежать некоторых проблем с кэшированием докеров и обновлением восходящего потока, поскольку вы блокируете восходящую версию в своей спецификации подмодуля/поддерева. Обновление их приведет к поломке кеша докеров, поскольку он изменит контекст сборки.

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

Вы можете видеть этот подход, используемый здесь

Dockerfile внутри репозитория git

Здесь вы просто используете свой файл Docker в том же репозитории git наряду с кодом, который хотите создать/протестировать/развернуть, поэтому он автоматически отправляется как часть контекста сборки, поэтому вы можете, например, добавить ADD./project, чтобы скопировать контекст в контейнер. Преимущество этого заключается в том, что вы можете протестировать изменения без необходимости совершать/нажимать их, чтобы получить их в тестовую сборку докеров; недостатком является то, что каждый раз, когда вы изменяете какие-либо файлы в своем рабочем каталоге, это приведет к аннулированию кеша при команде ADD. Отправка контекста сборки для большого каталога источника/данных также может занять много времени. Поэтому, если вы используете этот подход, вы также можете сделать разумное использование файла.dockerignore, в том числе делать что-то вроде игнорирования всего в вашем.gitignore и, возможно, самого каталога.git.

Отображение томов

Если вы используете Docker для настройки тестовой среды dev/test, которую вы хотите разделить между различными исходными репозиториями на вашей главной машине, установка каталога хоста в качестве тома данных может быть жизнеспособной стратегией. Это дает вам возможность указать, какие каталоги вы хотите включить во время выполнения docker, и избегает проблем с кэшированием сборки докеров, но ни один из них не будет использоваться среди других пользователей вашего файла Dockerfile или контейнера.

-

Рекомендации: