Bạn thường không muốn thực hiện một git clone
repo riêng từ bên trong bản dựng docker. Thực hiện sao chép ở đó liên quan đến việc đặt thông tin đăng nhập ssh riêng bên trong hình ảnh, nơi chúng có thể được trích xuất sau đó bởi bất kỳ ai có quyền truy cập vào hình ảnh của bạn.
Thay vào đó, thực tế phổ biến là sao chép git repo từ bên ngoài docker trong công cụ CI bạn chọn, và chỉ đơn giản là COPY
các tệp vào hình ảnh. Điều này có một lợi ích thứ hai: bộ nhớ đệm docker. Bộ nhớ đệm Docker xem lệnh đang chạy, các biến môi trường mà nó bao gồm, các tệp đầu vào, v.v. và nếu chúng giống hệt với bản dựng trước đó từ cùng bước cha, nó sẽ sử dụng lại bộ đệm trước đó. Với một git clone
lệnh, chính lệnh đó là giống hệt nhau, vì vậy docker sẽ sử dụng lại bộ đệm ngay cả khi thay đổi git repo bên ngoài. Tuy nhiên, một COPY
lệnh sẽ xem xét các tệp trong ngữ cảnh xây dựng và có thể xem chúng giống hệt nhau hay đã được cập nhật và chỉ sử dụng bộ đệm khi phù hợp.
Nếu bạn định thêm thông tin đăng nhập vào bản dựng của mình, hãy xem xét thực hiện với bản dựng nhiều giai đoạn và chỉ đặt các thông tin đó trong giai đoạn đầu không bao giờ được gắn thẻ và đẩy ra ngoài máy chủ bản dựng của bạn. Kết quả trông như sau:
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
...
Gần đây, BuildKit đã thử nghiệm một số tính năng thử nghiệm cho phép bạn chuyển khóa ssh dưới dạng gắn kết không bao giờ được ghi vào hình ảnh:
# 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
Và bạn có thể xây dựng nó với:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
Lưu ý rằng điều này vẫn yêu cầu khóa ssh của bạn không được bảo vệ bằng mật khẩu, nhưng ít nhất bạn có thể chạy bản dựng trong một giai đoạn duy nhất, xóa lệnh COPY và tránh thông tin ssh không bao giờ là một phần của hình ảnh.
BuildKit cũng đã thêm một tính năng chỉ dành cho ssh cho phép bạn vẫn có các khóa ssh được bảo vệ bằng mật khẩu, kết quả sẽ như sau:
# 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
Và bạn có thể xây dựng nó với:
$ 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 .
Một lần nữa, điều này được đưa vào bản dựng mà không bao giờ được ghi vào lớp hình ảnh, loại bỏ rủi ro thông tin có thể vô tình bị rò rỉ.
Để buộc docker chạy git clone
ngay cả khi các dòng trước đó đã được lưu vào bộ đệm, bạn có thể tiêm ARG bản dựng thay đổi theo từng bản dựng để phá vỡ bộ đệm. Trông giống như:
# 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
Sau đó, bạn tiêm mà thay đổi arg trong lệnh xây dựng docker:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .