Saya telah menyalin kode ini dari apa yang tampaknya merupakan berbagai dockerfiles yang bekerja di sekitar, ini milik saya:
FROM ubuntu
MAINTAINER Luke Crooks "[email protected]"
# 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 [email protected]:Pumalo/docker-conf.git /home/docker-conf
Ini memberi saya kesalahan
Step 10 : RUN git clone [email protected]: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 [email protected]:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128
Ini adalah pertama kalinya saya menggunakan dockerfiles, tetapi dari apa yang saya baca (dan diambil dari konfigurasi kerja) saya tidak bisa melihat mengapa ini tidak berhasil.
Id_rsa saya ada di folder yang sama dengan dockerfile saya dan merupakan salinan kunci lokal saya yang dapat mengkloning repo ini tanpa masalah.
Edit:
Di dockerfile saya, saya dapat menambahkan:
RUN cat /root/.ssh/id_rsa
Dan itu mencetak kunci yang benar, jadi saya tahu itu disalin dengan benar.
Saya juga telah berusaha melakukan apa yang disarankan oleh Nabi Nuh dan berlari:
RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
Sayangnya ini juga tidak berhasil.
ssh-keyscan
memiliki batas waktu default 5 detik yang sering melebihi bitbucket.ssh-keyscan
bahkan tidak akan melaporkan kesalahan. Jadi lebih baik lariRUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts
untuk aman.ssh-keyscan
itu masalah? Pemahaman saya adalah bahwa itu hanya akan menarik kunci publik dari Github / Bitbucket. Alternatif apa yang bisa digunakan sehingga tidak berakhir di lapisan?known_hosts
file. Orang-orang hanya membenarkan hal-hal acak ketika mereka terdengar cukup mengkhawatirkan.Anda harus membuat kunci SSH baru yang ditetapkan untuk gambar Docker itu, karena Anda mungkin tidak ingin menanamkan kunci pribadi Anda di sana. Untuk membuatnya berfungsi, Anda harus menambahkan kunci itu ke kunci penempatan di repositori git Anda. Ini resep lengkapnya:
Hasilkan kunci ssh dengan
ssh-keygen -q -t rsa -N '' -f repo-key
yang akan memberi Anda file kunci-repo dan repo-key.pub.Tambahkan repo-key.pub ke kunci penyebaran repositori Anda.
Pada GitHub, buka [repositori Anda] -> Pengaturan -> Sebarkan kunci
Tambahkan sesuatu seperti ini ke Dockerfile Anda:
Perhatikan bahwa di atas mematikan StrictHostKeyChecking, jadi Anda tidak perlu .ssh / known_hosts. Meskipun saya mungkin lebih suka solusi dengan ssh-keyscan di salah satu jawaban di atas.
sumber
fatal: Could not read from remote repository.
Tidak perlu bermain-main dengan konfigurasi ssh. Gunakan file konfigurasi (bukan Dockerfile) yang berisi variabel lingkungan, dan minta skrip shell memperbarui file docker Anda saat runtime. Anda menjaga token dari Dockerfiles Anda dan Anda dapat mengkloning lebih dari https (tidak perlu menghasilkan atau melewati kunci ssh).
Buka Pengaturan> Token Akses Pribadi
repo
ruang lingkup diaktifkan.git clone https://[email protected]/user-or-org/repo
Beberapa komentator telah mencatat bahwa jika Anda menggunakan Dockerfile bersama, ini dapat mengekspos kunci akses Anda kepada orang lain di proyek Anda. Meskipun ini mungkin atau mungkin tidak menjadi perhatian untuk kasus penggunaan khusus Anda, berikut adalah beberapa cara Anda dapat mengatasinya:
sed
atau serupa, yaitu memanggil skripsh rundocker.sh MYTOKEN=foo
yang akan digantihttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Perhatikan bahwa Anda juga dapat menggunakan file konfigurasi (dalam format .yml atau apa pun yang Anda inginkan) untuk melakukan hal yang sama tetapi dengan variabel lingkungan.sumber
Settings > Applications
?Pilihan lain adalah menggunakan multi-stage docker build untuk memastikan bahwa kunci SSH Anda tidak termasuk dalam gambar akhir.
Seperti yang dijelaskan dalam posting saya, Anda dapat menyiapkan gambar perantara Anda dengan dependensi yang diperlukan untuk mendapatkan clone dan kemudian
COPY
file yang diperlukan ke dalam gambar akhir Anda.Selain itu jika
LABEL
kami lapisan menengah kami, kami bahkan dapat menghapusnya dari mesin setelah selesai.Kita kemudian dapat membangun:
Buktikan kunci SSH kami hilang:
Bersihkan gambar setengah jadi dari mesin build:
sumber
RUN
sehingga Anda tidak meninggalkan kunci di lapisan gambar sebelumnya. Pada docker1.13
Anda dapat menggunakan argumen--squash
eksperimental yang akan menghapus kunci SSH di lapisan gambar akhir Anda juga.Untuk repositori bitbucket, buat Sandi Aplikasi (pengaturan Bitbucket -> Manajemen Akses -> Sandi Aplikasi, lihat gambar) dengan akses baca ke repo dan proyek.
Maka perintah yang harus Anda gunakan adalah:
sumber
--recursive
tidak berfungsi. Saya harus memasukkangit clone
untuk setiap submodule, yang baik-baik saja tetapi akan lebih bagus jika itu akan bekerja secara rekursif.Anda sering tidak ingin melakukan
git clone
repo pribadi dari dalam bangunan buruh pelabuhan. Melakukan klon di sana melibatkan menempatkan kredensial ssh pribadi di dalam gambar di mana mereka kemudian dapat diekstraksi oleh siapa pun dengan akses ke gambar Anda.Sebagai gantinya, praktik umum adalah mengkloning git repo dari luar docker di alat CI pilihan Anda, dan cukup
COPY
file ke dalam gambar. Ini memiliki manfaat kedua: caching buruh pelabuhan. Caching Docker melihat perintah yang sedang dijalankan, variabel lingkungan yang dicakupnya, memasukkan file, dll, dan jika mereka identik dengan build sebelumnya dari langkah induk yang sama, ia menggunakan kembali cache sebelumnya. Dengan sebuahgit clone
perintah, perintah itu sendiri identik, jadi buruh pelabuhan akan menggunakan kembali cache meskipun repo git eksternal diubah. Namun, sebuahCOPY
perintah akan melihat file dalam konteks build dan dapat melihat apakah mereka identik atau telah diperbarui, dan menggunakan cache hanya ketika itu sesuai.Jika Anda akan menambahkan kredensial ke dalam bangunan Anda, pertimbangkan untuk melakukannya dengan membangun multi-tahap, dan hanya menempatkan kredensial tersebut pada tahap awal yang tidak pernah ditandai dan didorong di luar host build Anda. Hasilnya terlihat seperti:
Baru-baru ini, BuildKit telah menguji beberapa fitur eksperimental yang memungkinkan Anda untuk meneruskan kunci ssh sebagai mount yang tidak pernah ditulis ke gambar:
Dan Anda dapat membangunnya dengan:
Perhatikan bahwa ini masih memerlukan kunci ssh Anda untuk tidak dilindungi kata sandi, tetapi Anda setidaknya dapat menjalankan build dalam satu tahap, menghapus perintah COPY, dan menghindari kredensial ssh agar tidak pernah menjadi bagian dari gambar.
BuildKit juga menambahkan fitur hanya untuk ssh yang memungkinkan Anda untuk tetap memiliki kunci ssh yang dilindungi kata sandi, hasilnya terlihat seperti:
Dan Anda dapat membangunnya dengan:
Sekali lagi, ini disuntikkan ke dalam bangunan tanpa pernah ditulis ke lapisan gambar, menghilangkan risiko bahwa kredensial bisa bocor secara tidak sengaja.
Untuk memaksa buruh pelabuhan untuk menjalankan
git clone
bahkan ketika baris sebelumnya telah di-cache, Anda bisa menyuntikkan ARG build yang berubah dengan setiap build untuk memecahkan cache. Itu terlihat seperti:Kemudian Anda menyuntikkan itu mengubah arg di perintah membangun buruh pelabuhan:
sumber
Solusi di atas tidak bekerja untuk bitbucket. Saya pikir ini melakukan trik:
sumber