Sık sık bir git clone
, docker yapısından özel bir repo . Orada klon yapmak, özel ssh kimlik bilgilerini daha sonra görüntünüze erişimi olan herkes tarafından çıkarılabilecekleri görüntünün içine yerleştirmeyi içerir.
Bunun yerine, yaygın uygulama, git repo'yu seçtiğiniz CI aracınızda docker'ın dışından ve sadece COPY
dosyaları görüntüye klonlamaktır . Bunun ikinci bir yararı var: liman işçisinin önbelleğe alınması. Docker önbelleğe alma işlemi, çalıştırılan komutu, içerdiği ortam değişkenlerini, girdi dosyalarını vb. İnceler ve aynı üst adımdaki önceki bir derleme ile aynıysa, önceki önbelleği yeniden kullanır. Bir git clone
komutla komutun kendisi aynıdır, bu nedenle harici git repo değiştirilse bile docker önbelleği yeniden kullanır. Ancak, bir COPY
komut derleme bağlamındaki dosyalara bakacak ve aynı veya güncellenmiş olup olmadığını görebilir ve önbelleği yalnızca uygun olduğunda kullanabilir.
Yapınıza kimlik bilgileri ekleyecekseniz, bunu çok aşamalı bir yapı ile yapmayı ve bu kimlik bilgilerini yalnızca hiçbir zaman etiketlenmemiş ve yapı ana makinenizin dışına aktarılmamış olan erken bir aşamaya yerleştirmeyi düşünün. Sonuç şuna benzer:
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
...
Son zamanlarda, BuildKit bir ssh anahtarını görüntüye asla yazılmayan bir montaj parçası olarak geçirmenize izin veren bazı deneysel özellikleri test ediyor:
# 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
Ve bunu aşağıdakilerle oluşturabilirsiniz:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
Bunun yine de ssh anahtarınızın parola korumalı olmamasını gerektirdiğini, ancak en azından bir COPY komutunu kaldırarak ve ssh kimlik bilgisinin görüntünün bir parçası olmasını önleyerek derlemeyi tek bir aşamada çalıştırabileceğinizi unutmayın.
BuildKit ayrıca ssh için sadece şifre korumalı ssh tuşlarına sahip olmanıza izin veren bir özellik ekledi, sonuç şöyle görünüyor:
# 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
Ve bunu aşağıdakilerle oluşturabilirsiniz:
$ 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 .
Yine, bu, bir görüntü katmanına yazılmadan yapıya enjekte edilir ve kimlik bilgisinin yanlışlıkla dışarı sızma riski ortadan kaldırılır.
Docker'ı git clone
daha önceki satırlar önbelleğe alındığında bile çalıştırmaya zorlamak için, önbelleği kırmak üzere her derlemede değişen bir yapı ARG'si enjekte edebilirsiniz. Şöyle görünüyor:
# 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
Sonra docker build komutunda bu değişen argümanı enjekte edersiniz:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .