บ่อยครั้งที่คุณไม่ต้องการทำgit clone
ธุรกรรมซื้อคืนภาคเอกชนจากภายในตัวสร้างนักเทียบท่า การโคลนมีการวางข้อมูลประจำตัว ssh ส่วนตัวภายในภาพที่พวกเขาสามารถสกัดได้ในภายหลังโดยใครก็ตามที่สามารถเข้าถึงภาพของคุณ
แต่วิธีปฏิบัติทั่วไปคือการโคลน repo git จากด้านนอกของ docker ในเครื่องมือ CI ที่คุณเลือกและเพียงแค่COPY
ไฟล์ลงในภาพ นี่มีประโยชน์ที่สอง: แคชนักเทียบท่า การแคชนักเทียบท่าดูที่คำสั่งที่กำลังรันตัวแปรสภาพแวดล้อมที่มีไฟล์อินพุต ฯลฯ และหากเหมือนกันกับบิลด์ก่อนหน้าจากขั้นตอนพาเรนต์เดียวกันจะใช้แคชก่อนหน้านี้อีกครั้ง ด้วยgit clone
คำสั่งคำสั่งจะเหมือนกันดังนั้นนักเทียบท่าจะนำแคชกลับมาใช้ใหม่แม้ว่า repo 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 .
อีกครั้งสิ่งนี้จะถูกฉีดเข้าไปในงานสร้างโดยไม่ต้องเขียนลงในเลเยอร์รูปภาพเพื่อลดความเสี่ยงที่ข้อมูลรับรองอาจรั่วไหลออกมาโดยไม่ตั้งใจ
หากต้องการบังคับให้นักเทียบท่าเรียกใช้งาน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
จากนั้นคุณเพิ่มการเปลี่ยนแปลง arg ในคำสั่ง build docker:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .