Какова наилучшая стратегия клонирования частного репозитория Git в контейнер Docker с использованием файла Docker? За и против?
Я знаю, что я могу добавлять команды в Dockerfile, чтобы клонировать мой приватный репозиторий в контейнер докеров. Но я хотел бы знать, какие разные подходы люди использовали в этом деле.
Это не описано в руководстве по лучшим практикам Dockerfile.
Ответ 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 или контейнера.
-
Рекомендации: