โคลน repo คอมไพล์ส่วนตัวด้วย dockerfile


240

ฉันได้คัดลอกรหัสนี้จากสิ่งที่ดูเหมือนจะทำงานได้หลากหลาย dockerfiles นี่คือของฉัน:

FROM ubuntu

MAINTAINER Luke Crooks "luke@pumalo.org"

# Update aptitude with new repo
RUN apt-get update

# Install software 
RUN apt-get install -y git python-virtualenv

# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh

# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Remove host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด

Step 10 : RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf
 ---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128

นี่เป็นครั้งแรกที่ฉันใช้ dockerfiles แต่จากสิ่งที่ฉันได้อ่าน (และนำมาจากการตั้งค่าการทำงาน) ฉันไม่เห็นสาเหตุที่ใช้งานไม่ได้

id_rsa ของฉันอยู่ในโฟลเดอร์เดียวกับ dockerfile ของฉันและเป็นสำเนาของรหัสท้องถิ่นของฉันซึ่งสามารถคัดลอก repo นี้ไม่มีปัญหา

แก้ไข:

ใน dockerfile ของฉันฉันสามารถเพิ่ม:

RUN cat /root/.ssh/id_rsa

และมันพิมพ์คีย์ที่ถูกต้องออกมาดังนั้นฉันจึงรู้ว่ามันถูกคัดลอกอย่างถูกต้อง

ฉันได้ลองทำตามที่โนอาห์แนะนำแล้ววิ่ง:

RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config

เรื่องนี้น่าเศร้าที่ไม่ได้ผล

คำตอบ:


300

รหัสของฉันได้รับการป้องกันด้วยรหัสผ่านซึ่งก่อให้เกิดปัญหาขณะนี้ไฟล์ทำงานอยู่ในรายการด้านล่าง (สำหรับความช่วยเหลือของ googler ในอนาคต)

FROM ubuntu

MAINTAINER Luke Crooks "luke@pumalo.org"

# Update aptitude with new repo
RUN apt-get update

# Install software 
RUN apt-get install -y git
# Make ssh dir
RUN mkdir /root/.ssh/

# 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
ADD id_rsa /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Add bitbuckets key
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git

11
ในกรณีนี้นี่คือลิงค์อธิบายวิธีลบการป้องกันรหัสผ่านของคีย์
Thomas

82
เพียงแค่ FYI หลังจากที่คุณเรียกใช้ RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts รูปภาพจะบันทึกเป็นเลเยอร์ หากใครก็ตามได้รับรูปภาพของคุณพวกเขาสามารถเรียกคืนคีย์ ... แม้ว่าคุณจะลบไฟล์นั้นในเลเยอร์ในภายหลัง b / c พวกเขาสามารถกลับไปที่ขั้นตอนที่ 7 เมื่อคุณเพิ่มมัน
เบอร์นีเปเรซ

23
ขอบคุณสำหรับคำตอบที่เป็นประโยชน์ แต่สำหรับเราการสร้างล้มเหลวแบบสุ่มและหลังจากการตรวจสอบเราพบว่าssh-keyscanมีการหมดเวลาเริ่มต้นของ 5 วินาทีซึ่งบิตบิตที่มักจะเกิน ssh-keyscanจะไม่รายงานข้อผิดพลาดด้วยซ้ำ ดังนั้นควรวิ่งRUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hostsให้ปลอดภัย
ของไหล

5
มีใครช่วยอธิบายได้ว่าทำไมการรันssh-keyscanจึงเป็นปัญหา ความเข้าใจของฉันคือมันจะดึงกุญแจสาธารณะของ Github / Bitbucket มีทางเลือกอื่นใดบ้างที่ใช้ไม่ได้ในเลเยอร์
Pedro

9
@Pedro ขั้นตอนที่สำคัญในการสแกนโดยเฉพาะนั้นไม่ได้เป็นปัญหาเลย หากมีสิ่งใดกุญแจสาธารณะของโฮสต์เหล่านี้ควรกระจายให้มากที่สุด ดู sshd (8) สำหรับรายละเอียดเกี่ยวกับknown_hostsไฟล์ ผู้คนเพียงอัปโหลดสิ่งต่าง ๆ แบบสุ่มเมื่อพวกเขาฟังดูน่ากลัวเพียงพอ
tne

99

คุณควรสร้างชุดคีย์ SSH ใหม่สำหรับอิมเมจ Docker นั้นเนื่องจากคุณอาจไม่ต้องการฝังคีย์ส่วนตัวของคุณเอง ในการทำให้ใช้งานได้คุณจะต้องเพิ่มคีย์นั้นในคีย์การปรับใช้ในที่เก็บ git ของคุณ นี่คือสูตรที่สมบูรณ์:

  1. สร้างคีย์ ssh ssh-keygen -q -t rsa -N '' -f repo-keyซึ่งจะให้ไฟล์ repo-key และ repo-key.pub แก่คุณ

  2. เพิ่ม repo-key.pub ไปยังคีย์การปรับใช้ที่เก็บของคุณ
    บน GitHub ไปที่ [พื้นที่เก็บข้อมูลของคุณ] -> การตั้งค่า -> ปรับใช้คีย์

  3. เพิ่มสิ่งนี้ลงใน Dockerfile ของคุณ:

    เพิ่ม repo-key /
    วิ่ง \
      chmod 600 / repo-key && \  
      echo "IdentityFile / repo-key" >> / ฯลฯ / ssh / ssh_config && \  
      echo -e "StrictHostKeyChecking no" >> / etc / ssh / ssh_config && \  
      // คำสั่ง git clone ของคุณที่นี่ ...
    

โปรดทราบว่าด้านบนปิด StrictHostKeyChecking ดังนั้นคุณไม่จำเป็นต้องใช้. ssh / known_hosts แม้ว่าฉันอาจต้องการโซลูชันเพิ่มเติมด้วย ssh-keyscan ในหนึ่งในคำตอบข้างต้น


6
คำเตือน: ในการกำหนดค่าของฉัน echo -e "... " ยังเขียน -e ในไฟล์ เพียงแค่ลบธงและมันก็ใช้ได้ดี
Conchylicultor

คำตอบของคุณสมบูรณ์แบบมากในการช่วยฉันแก้ปัญหาของฉัน ขอบคุณ!
David Pointer

ฉันยังมีปัญหาเดียวกัน:fatal: Could not read from remote repository.
อเล็กซ์

1
ขอบคุณมาก! ฉันกำลังจะประกาศความรักต่อคุณ คุณแก้ไขปัญหาที่ฉันต้องต่อสู้หลายวัน!
alexandra

คำตอบที่เลือกไว้สำหรับคำถามนี้ไม่ใช่คำตอบที่ดีอีกต่อไป มันถูกต้องในปี 2014 แต่สำหรับ 2020 นี่เป็นคำตอบที่ถูกต้อง
Bikal Basnet

70

ไม่จำเป็นต้องเล่นซอกับการกำหนดค่า ssh ใช้ไฟล์การกำหนดค่า (ไม่ใช่ Dockerfile) ที่มีตัวแปรสภาพแวดล้อมและให้เชลล์สคริปต์อัปเดตไฟล์นักเทียบท่าของคุณตอนรันไทม์ คุณเก็บโทเค็นออกจาก Dockerfiles ของคุณและคุณสามารถโคลนผ่าน https (ไม่จำเป็นต้องสร้างหรือส่งคีย์ ssh)

ไปที่การตั้งค่า> โทเค็นการเข้าถึงส่วนบุคคล

  • สร้างโทเค็นการเข้าถึงส่วนบุคคลด้วยการrepoเปิดใช้งานขอบเขต
  • โคลนแบบนี้: git clone https://MY_TOKEN@github.com/user-or-org/repo

ผู้แสดงความคิดเห็นบางคนระบุว่าหากคุณใช้ Dockerfile ที่ใช้ร่วมกันสิ่งนี้อาจเปิดเผยรหัสการเข้าถึงของคุณให้ผู้อื่นในโครงการ แม้ว่านี่จะเป็นเรื่องที่น่ากังวลสำหรับกรณีการใช้งานเฉพาะของคุณ แต่นี่คือวิธีการบางอย่างที่คุณสามารถทำได้:

  • ใช้เชลล์สคริปต์เพื่อยอมรับอาร์กิวเมนต์ที่อาจมีคีย์ของคุณเป็นตัวแปร แทนที่ตัวแปรใน Dockerfile ของคุณด้วยsedหรือคล้ายกันคือการเรียกสคริปต์ด้วยซึ่งจะเข้ามาแทนที่ในsh rundocker.sh MYTOKEN=foo https://{{MY_TOKEN}}@github.com/user-or-org/repoโปรดทราบว่าคุณสามารถใช้ไฟล์กำหนดค่า (ในรูปแบบ .yml หรือรูปแบบใดก็ได้ที่คุณต้องการ) เพื่อทำสิ่งเดียวกัน แต่ใช้ตัวแปรสภาพแวดล้อม
  • สร้างผู้ใช้ github (และสร้างโทเค็นการเข้าถึง) สำหรับโครงการนั้นเท่านั้น

คุณกำลังพูดถึงบริบทSettings > Applicationsอะไร
turboladen

1
ข้อเสียของวิธีการนี้คือคุณกำลังจัดเก็บข้อมูลรับรองสำหรับ repo ส่วนตัวภายใน Dockerfile ซึ่งตรงข้ามกับวิธีการของ @ crooksey ซึ่งจะช่วยให้คุณสามารถอ้างอิงคีย์ที่จัดเก็บแยกต่างหากจาก Dockerfile หากไม่มีบริบทเกี่ยวกับวิธีการที่ OP เก็บไฟล์ Dockerfile เราไม่สามารถระบุได้ว่าจะทำให้เกิดปัญหาหรือไม่ แต่จากประสบการณ์ส่วนตัวฉันต้องการจัดเก็บ Dockerfiles ของฉันภายใน VCS และไม่ต้องการยอมรับสิ่งใด ๆ ที่มีข้อมูลประจำตัว เมื่อนักเทียบท่าใช้ความสามารถในการส่งผ่านตัวแปร env เพื่อสร้างคำสั่งแล้วฉันยอมรับว่านี่จะเป็นวิธีที่สะอาด
Jabbslad

2
@CalvinFroedge โดยคนท้องถิ่นฉันคิดว่าคุณหมายถึงโฮสต์ของคุณหรือไม่ ผมไม่ทราบวิธีที่จะเปิดเผยตัวแปรสภาพแวดล้อมบนโฮสต์คอนเทนเนอร์ที่สร้างเวลาซึ่งเป็นเหตุผลที่เรามีเปิดประเด็นเช่นนี้github.com/docker/docker/issues/6822 กรุณาช่วยอธิบายให้ฟังหน่อยได้ไหม?
Jabbslad

1
แม้สะอาดกว่า (แยกความกังวล): ไดรฟ์ข้อมูลที่เชื่อมโยงสำหรับ repo ที่โคลน + คอนเทนเนอร์เฉพาะสำหรับงานการโคลน + ไดรฟ์ข้อมูลที่เชื่อมโยงกับคีย์ SSH เท่านั้น (หรือโทเค็นตามที่คุณแนะนำ) ดูstackoverflow.com/a/30992047อาจจะรวมกับstackoverflow.com/a/29981990
Peterino

9
อีกคำถามคือสำหรับ BITBUCKET repo ไม่ใช่ GitHub repo
Michael Draper

25

อีกตัวเลือกหนึ่งคือการใช้ตัวสร้างแบบหลายขั้นตอนเพื่อให้แน่ใจว่าคีย์ SSH ของคุณไม่รวมอยู่ในอิมเมจสุดท้าย

ตามที่อธิบายไว้ในโพสต์ของฉันคุณสามารถเตรียมภาพกลางของคุณด้วยการอ้างอิงที่จำเป็นในการโคลนคอมไพล์แล้วCOPYไฟล์ที่จำเป็นในภาพสุดท้ายของคุณ

นอกจากนี้ถ้าเราLABELเลเยอร์กลางของเราเรายังสามารถลบออกจากเครื่องเมื่อเสร็จสิ้น

# Choose and name our temporary image.
FROM alpine as intermediate
# Add metadata identifying these images as our build containers (this will be useful later!)
LABEL stage=intermediate

# Take an SSH key as a build argument.
ARG SSH_KEY

# Install dependencies required to git clone.
RUN apk update && \
    apk add --update git && \
    apk add --update openssh

# 1. Create the SSH directory.
# 2. Populate the private key file.
# 3. Set the required permissions.
# 4. Add github to our list of known hosts for ssh.
RUN mkdir -p /root/.ssh/ && \
    echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod -R 600 /root/.ssh/ && \
    ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

# Clone a repository (my website in this case)
RUN git clone git@github.com:janakerman/janakerman.git

# Choose the base image for our final image
FROM alpine

# Copy across the files from our `intermediate` container
RUN mkdir files
COPY --from=intermediate /janakerman/README.md /files/README.md

จากนั้นเราสามารถสร้าง:

MY_KEY=$(cat ~/.ssh/id_rsa)
docker build --build-arg SSH_KEY="$MY_KEY" --tag clone-example .

พิสูจน์ว่ากุญแจ SSH ของเราหายไปแล้ว:

docker run -ti --rm clone-example cat /root/.ssh/id_rsa

ทำความสะอาดภาพกลางจากเครื่องสร้าง:

docker rmi -f $(docker images -q --filter label=stage=intermediate)

ARG SSH_PRIVATE_KEY ต้องถูกแทนที่ด้วย ARG SSH_KEY
Joseph Persie

เราไม่สามารถลบคีย์ได้เมื่อ git clone เสร็จแล้ว?
Broncha

1
คุณสามารถทำได้ แต่คุณจำเป็นต้องทำมันเป็นส่วนหนึ่งของเดียวRUNเพื่อที่คุณจะไม่ทิ้งกุญแจไว้ในเลเยอร์ภาพก่อนหน้า ในฐานะนักเทียบท่า1.13คุณสามารถใช้ อาร์กิวเมนต์--squash ทดลองซึ่งจะลบคีย์ SSH ในเลเยอร์ภาพสุดท้ายของคุณด้วย
ขนมปัง

19

สำหรับพื้นที่เก็บข้อมูล bitbucket ให้สร้างรหัสผ่านสำหรับแอป (การตั้งค่า Bitbucket -> การจัดการการเข้าถึง -> รหัสผ่านสำหรับแอปดูภาพ) พร้อมการเข้าถึงการอ่าน repo และโครงการ

เมนูผู้ใช้ bitbucket

จากนั้นคำสั่งที่คุณควรใช้คือ:

git clone https://username:generated_password@bitbucket.org/reponame/projectname.git

1
ที่ง่ายที่สุด :) ผมต้องยอมรับว่าผมชอบวิธีการ SSH ตาม แต่ฉันไม่สามารถรับใด ๆ ข้างต้นทำงาน ... ไฟล์ไม่พบ ฯลฯ
Janos

ฉันไม่เห็น "การจัดการการเข้าถึง" ... ฉันคิดว่ามันล้าสมัยหรือไม่
Martin Thoma

1
ทำงาน! ธรรมดาและเรียบง่าย ... เยี่ยมมาก!
Josemy

2
แน่นอน ... คุณเพียงแค่คลิกที่รูปโปรไฟล์ของคุณที่แถบด้านซ้ายจากนั้นในการตั้งค่า Bitbucketและคุณจะเห็นสิ่งนี้: imgur.com/EI33zj3
Josemy

1
สิ่งนี้ใช้ได้สำหรับฉัน อย่างไรก็ตามฉันมี submodules และ--recursiveไม่ทำงาน ฉันต้องใส่ในgit cloneแต่ละ submodule ซึ่งก็ดี แต่มันก็ดีถ้ามันจะทำงานซ้ำ
Zailyn Tamayo

14

บ่อยครั้งที่คุณไม่ต้องการทำ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 .

คุณแนะนำให้ใช้คอมไพล์จากด้านนอก Docker แต่คุณจะอธิบายวิธีจัดการกับคีย์ ssh ได้อย่างไร คุณพิจารณาถึงความจำเป็น / เหมาะสมเมื่อใด
JCarlosR

2
@JCarlosR เมื่อคุณไม่มีระบบภายนอกที่จะใช้งานบิลด์ (เช่นระบบ CI / CD ที่สามารถเรียกใช้โคลนได้ล่วงหน้า) อาจมีข้อยกเว้น แต่การโคลนภายใน Dockerfile นั้นเป็นกลิ่นรหัส
BMitch

1

วิธีแก้ไขปัญหาข้างต้นไม่สามารถใช้กับบิตบิตได้ ฉันคิดว่านี่เป็นกลอุบาย:

RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts \
    && eval `ssh-agent` \
    && ssh-add ~/.ssh/[key] \
    && git clone git@bitbucket.org:[team]/[repo].git
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.