Перейти к основному содержимому

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

· 4 мин. чтения

1. Введение

.Git — ведущая система контроля версий для разработки программного обеспечения. С другой стороны, Dockerfile содержит все команды для автоматического создания образа нашего приложения. Эти два продукта — идеальное сочетание для тех, кто хочет внедрить DevOps .

В этом руководстве мы рассмотрим несколько решений для объединения этих двух технологий. Мы подробно рассмотрим каждое решение и рассмотрим его плюсы и минусы.

2. Dockerfile внутри репозитория Git

Самое простое решение для постоянного доступа к репозиторию Git внутри Dockerfile — хранить Dockerfile непосредственно в репозитории Git:

ProjectFolder/
.git/
src/
pom.xml
Dockerfile
...

В приведенной выше настройке мы дадим нам доступ ко всему исходному каталогу проекта. Далее мы можем включить его в наш контейнер с помощью команды ADD , например:

ADD . /project/

Конечно, мы можем ограничить область копирования каталогом сборки:

ADD /build/ /project/

или вывод сборки, например файл .jar:

ADD /output/project.jar /project/

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

Здесь нужно помнить одну вещь: создать файл .dockerignore . Он похож на файл .gitignore , но в этом случае он исключает из контекста Docker файлы и каталоги, соответствующие шаблонам в нем. Это помогает нам избежать ненужной отправки больших или конфиденциальных файлов и каталогов в процесс сборки Docker и потенциального добавления их в образы.

3. Клонируйте репозиторий Git

Еще одно простое решение — просто получить наш репозиторий git во время процесса сборки образа. Мы можем добиться этого, просто добавив ключ SSH в локальное хранилище и вызвав команду git clone :

ADD ssh-private-key /root/.ssh/id_rsa
RUN git clone git@github.com:foreach/tutorials.git

Приведенная выше команда извлечет весь репозиторий и поместит его в каталог ./tutorials в нашем контейнере.

К сожалению, у этого решения есть и недостатки.

Прежде всего, мы будем хранить наш закрытый SSH-ключ в образе Docker, что может вызвать потенциальные проблемы с безопасностью. Мы можем применить обходной путь, используя имя пользователя и пароль для репозитория git:

ARG username=$GIT_USERNAME
ARG password=$GIT_PASSWORD
RUN git clone https://username:password@github.com:foreach/tutorials.git

и передать их как переменные окружения с нашей машины. Таким образом, мы сохраним учетные данные git за пределами нашего образа.

Во-вторых, этот шаг будет закеширован в более поздних сборках, даже если наш репозиторий изменится. Это связано с тем, что строка с командой RUN остается неизменной, если вы не сломаете кеш на более раннем этапе. Хотя мы можем решить эту проблему, добавив параметр –no-cache в команду сборки docker .

Еще один небольшой недостаток заключается в том, что мы должны установить пакет git в наш контейнер.

4. Отображение объема

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

Мы можем сделать это, добавив следующую строку в наш Dockerfile:

VOLUME /build/ /project/

Это создаст каталог /project в контейнере и смонтирует его в каталог /build на нашем компьютере.

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

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

5. Подмодули Git

В тех случаях, когда мы храним Dockerfile и исходный код в отдельных репозиториях или для нашей сборки Docker требуется несколько исходных репозиториев, мы можем рассмотреть возможность использования подмодулей Git .

Во-первых, нам нужно создать новый репозиторий Git и поместить туда наш Dockerfile. Далее мы можем определить наши подмодули, добавив их в файл .gitmodules:

[submodule "project"]
path = project
url = https://github.com/foreach/tutorials.git
branch = master

Теперь мы можем использовать подмодуль как стандартный каталог. Например, мы можем скопировать его содержимое в наш контейнер:

ADD /build/ /project/

Помните, что подмодули не обновляются автоматически. Нам нужно запустить следующую команду git, чтобы получить последние изменения:

git submodule update --init --recursive

6. Обзор

В этом руководстве мы узнали несколько способов использования репозитория Git внутри Dockerfile. Как всегда, весь исходный код доступен на GitHub .