Ви часто не хочете виконувати git clone приватне репо зсередини докерної збірки. Здійснення клону там передбачає розміщення приватних облікових даних ssh всередині зображення, де їх згодом може бути вилучено будь-ким, хто має доступ до вашого зображення.
Натомість загальною практикою є клонування git repo з-під докера у вашому інструменті CI на вибір, а просто COPYфайли у зображення. Це має другу перевагу: кешування докера. Докерне кешування розглядає запущену команду, змінні середовища, які вона включає, вхідні файли тощо, і якщо вони ідентичні попередній збірці з того ж батьківського кроку, вона повторно використовує попередній кеш. З git cloneкомандою сама команда ідентична, тому докер повторно використовувати кеш, навіть якщо зовнішній git repo буде змінено. Однак 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 .
Знову ж таки, це вводиться у збірку, не записуючись ніколи на шар зображення, знімаючи ризик випадкового витоку облікових даних.
Щоб змусити докер виконувати 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 build:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .