Ви часто не хочете виконувати 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 .