Вы часто не хотите выполнять git clone
частное репо из сборки Docker. Выполнение клона предполагает размещение личных учетных данных ssh внутри изображения, где они могут быть впоследствии извлечены любым пользователем, имеющим доступ к вашему изображению.
Вместо этого обычной практикой является клонирование git-репозитория из-за пределов докера в выбранном вами инструменте CI и просто COPY
файлы в образ. Это имеет второе преимущество: кэширование докера. Кэширование Docker проверяет выполняемую команду, включенные в нее переменные среды, входные файлы и т. Д., И если они идентичны предыдущей сборке из того же родительского шага, он использует этот предыдущий кэш. Сgit clone
команды сама команда идентична, поэтому docker будет повторно использовать кэш, даже если внешнее git-репо изменилось. Тем не менее, COPY
команда будет смотреть на файлы в контексте сборки и может видеть, идентичны ли они или были обновлены, и использовать кеш только тогда, когда это уместно.
Если вы собираетесь добавить учетные данные в свою сборку, рассмотрите возможность сделать это с многоэтапной сборкой, и размещайте эти учетные данные только на ранней стадии, которая никогда не будет помечена и выдвинута за пределы хоста сборки. Результат выглядит так:
FROM ubuntu as clone
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
COPY id_rsa /root/.ssh/id_rsa
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
FROM ubuntu as release
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
COPY --from=clone /repo /repo
...
Совсем недавно BuildKit тестировал некоторые экспериментальные функции, которые позволяют передавать ключ ssh как монтирование, которое никогда не записывается в образ:
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_rsa \
git clone git@bitbucket.org:User/repo.git
И вы можете построить это с:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
Обратите внимание, что для этого все еще требуется, чтобы ваш ключ ssh не был защищен паролем, но вы можете, по крайней мере, запустить сборку за один этап, удалив команду COPY и избегая того, чтобы учетные данные ssh когда-либо были частью образа.
BuildKit также добавил функцию только для ssh, которая позволяет вам сохранить ваши ssh-ключи, защищенные паролем, результат выглядит так:
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=ssh \
git clone git@bitbucket.org:User/repo.git
И вы можете построить это с:
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--ssh default=$SSH_AUTH_SOCK .
Опять же, это внедряется в сборку без записи в слой изображения, что устраняет риск случайной утечки учетных данных.
Чтобы заставить docker запускать git clone
даже когда кэшированные строки были ранее кэшированы, вы можете ввести ARG сборки, которая меняется с каждой сборкой, чтобы сломать кеш. Это выглядит так:
# inject a datestamp arg which is treated as an environment variable and
# will break the cache for the next RUN command
ARG DATE_STAMP
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
Затем вы вводите этот изменяемый аргумент в команду сборки docker:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .