Saya baru mengenal buruh pelabuhan. Saya baru saja mencoba menggunakan buruh pelabuhan di mesin lokal saya (Ubuntu 16.04) dengan Jenkins.
Saya mengkonfigurasi pekerjaan baru dengan skrip pipeline di bawah ini.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
Tetapi gagal dengan kesalahan di bawah ini.
docker
jenkins
jenkins-pipeline
Ponsuyambu Velladurai
sumber
sumber
Jawaban:
Pengguna
jenkins
perlu ditambahkan ke grupdocker
:Kemudian restart Jenkins.
Edit
Jika Anda sampai pada pertanyaan stack overflow ini karena Anda menerima pesan ini dari buruh pelabuhan, tetapi Anda tidak menggunakan jenkins, kemungkinan besar kesalahannya sama: pengguna Anda yang tidak memiliki hak milik tidak termasuk dalam kelompok buruh pelabuhan.
Anda dapat melakukan:
atau apa pun nama pengguna Anda.
Anda dapat memeriksanya pada akhirnya
grep docker /etc/group
dan melihat sesuatu seperti ini:di salah satu garis.
Kemudian ubah ID grup pengguna Anda menjadi
docker
:sumber
sudo usermod -a -G docker $USER
dan logout atau reboot. linknewgrp docker
di sesi terminal yang sama.Solusi pertama saya adalah:
Tapi tidak ada yang bekerja untuk saya, saya mencoba:
Itu berhasil, tapi saya tidak tahu apakah itu panggilan yang tepat.
sumber
docker.sock
file bukan solusi terbaik, Anda hanya perlu menjalankanusermod
... instruksi, dan kemudian reboot sistem Anda, jika tidak maka tidak akan berpengaruhSukses buat saya
sumber
2018-08-19
Saya telah terjebak selama berhari-hari dalam hal ini dan karena saya belum menemukan jawaban lengkap dengan mengapa dan bagaimana, saya akan memposting satu untuk orang lain yang tersandung pada masalah yang sama dan jawaban dari atas tidak berfungsi.
Ini adalah 3 langkah penting ketika menjalankan Jenkins di dalam docker:
/var/run/docker.sock
ke wadah jenkins agar dapat menggunakan buruh pelabuhan dari tuan rumah.sudo usermod -a -G docker jenkins
untuk menambahkan jenkins ke grup buruh pelabuhan. Namun, di sini Anda mungkin mengalami masalah izin jika buruh pelabuhan tuan rumah dan buruh pelabuhan kontainer tidak memiliki id grup yang sama sehingga sangat penting untuk menyesuaikan gid docker kontainer agar sama dengan gid docker hostAnda dapat melakukan ini sebagai bagian dari script peluncuran atau hanya dengan menggunakan
exec
dan melakukannya secara manual:groupmod -g <YOUR_HOST_DOCKER_GID> docker
.Juga, tidak mengubah hak akses dari
/var/run/docker.sock
ke 777 atau hal-hal seperti itu karena itu adalah resiko keamanan besar, Anda pada dasarnya memberikan semua orang izin untuk penggunaan buruh pelabuhan pada mesin AndaSemoga ini membantu
sumber
Saya menambahkan pengguna jenkins ke grup root dan me-restart jenkins dan mulai bekerja.
sumber
Ubah izin akses file docker.sock
atau Anda dapat menggunakan
sudo
di awal perintah.chmod 777
akan memungkinkan semua tindakan untuk semua pengguna sementarachmod 666
akan memungkinkan semua pengguna untuk membaca dan menulis tetapi tidak dapat menjalankan file.sumber
Cukup menambahkan
docker
sebagai grup tambahan untukjenkins
penggunatidak selalu cukup ketika menggunakan gambar Docker sebagai Agen Jenkins . Yaitu, jika Anda
Jenkinsfile
memulai denganpipeline{agent{dockerfile
ataupipeline{agent{image
:Ini karena Jenkins melakukan
docker run
perintah, yang menghasilkan tiga masalah.docker run
tidak melakukan login ke wadah (lebih seperti asudo
).Menginstal Docker untuk Agen
Membuat program Docker tersedia dalam gambar Docker hanya perlu menjalankan langkah-langkah instalasi Docker di Dockerfile Anda:
Berbagi soket daemon Docker
Seperti yang telah dikatakan sebelumnya , memperbaiki masalah kedua berarti menjalankan wadah Jenkins Docker sehingga berbagi soket daemon Docker dengan daemon Docker yang berada di luar wadah. Jadi, Anda perlu memberi tahu Jenkins untuk menjalankan wadah Docker dengan berbagi itu, dengan demikian:
Pengaturan UID dan GID
Perbaikan ideal untuk masalah ketiga adalah membentuk kelompok tambahan untuk Agen. Tampaknya itu tidak mungkin. Satu-satunya perbaikan yang saya ketahui adalah menjalankan Agen dengan Jenkins UID dan Docker GID (soket memiliki izin menulis kelompok dan dimiliki oleh
root.docker
). Tetapi secara umum, Anda tidak tahu apa itu ID (mereka dialokasikan ketikauseradd ... jenkins
dangroupadd ... docker
berjalan ketika Jenkins dan Docker diinstal pada host). Dan Anda tidak bisa sekadar memberi tahu Jenkins kepada penggunajenkins
dan grup penggunadocker
karena itu memberitahu Docker untuk menggunakan pengguna dan grup yang dinamai
jenkins
dandocker
di dalam gambar , dan gambar Docker Anda mungkin tidak memilikijenkins
pengguna dan grup, dan bahkan jika itu terjadi tidak akan ada jaminan ia akan memiliki UID dan GID yang sama dengan tuan rumah, dan sama tidak ada jaminan bahwadocker
GID adalah samaUntungnya, Jenkins menjalankan
docker build
perintah untuk Dockerfile Anda dalam sebuah skrip, sehingga Anda dapat melakukan beberapa keajaiban skrip shell untuk melewati informasi itu ketika Docker membuat argumen:Itu menggunakan
id
perintah untuk mendapatkan UID dan GID darijenkins
pengguna danstat
perintah untuk mendapatkan informasi tentang soket Docker.Dockerfile Anda dapat menggunakan informasi itu untuk mengatur
jenkins
pengguna dandocker
grup untuk Agen, menggunakangroupadd
,groupmod
danuseradd
:sumber
-u jenkins:$(getent group docker | cut -d: -f3)
?args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
denganargs '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker'
Ketika melewati -u jenkins: docker, Anda mengubah grup pengguna utama, yang berarti ketika pengguna menulis file, katakanlah di ruang kerja, itu akan mengatur file pengguna untuk jenkins dan grup ke buruh pelabuhan. Yang mungkin bukan itu yang kita inginkan.Saya memiliki Jenkins yang berjalan di Docker dan terhubung Jenkins menggunakan soket Docker dari mesin host Ubuntu 16.04 melalui volume ke /var/run/docker.sock.
Bagi saya solusinya adalah:
1) Di dalam wadah Docker dari Jenkins (
docker exec -it jenkins bash
pada mesin host)2) Pada mesin host:
664
berarti - baca dan tulis (tetapi tidak dijalankan) untuk pemilik dan pengguna dari grup.sumber
Saat melakukan konfigurasi produksi saya mendapat masalah izin. Saya mencoba solusi di bawah ini untuk menyelesaikan masalah.
Pesan eror
Solusi: izin soket yang ditunjukkan dalam pesan kesalahan, /var/run/docker.sock:
Setelah perubahan izin untuk docket.sock kemudian jalankan perintah di bawah ini untuk memeriksa izin.
sumber
Dalam kasus saya, itu tidak hanya perlu menambahkan
jenkins
pengguna kedocker
grup, tetapi menjadikan grup itu grup utamajenkins
pengguna.Jangan lupa untuk menghubungkan kembali node jenkins slave atau me-restart server jenkins, tergantung pada kasus Anda.
sumber
2019-02-16
Sebagian besar langkah saya sama dengan yang telah ditulis orang lain. Namun, saya tidak dapat menambahkan jenkins ke buruh pelabuhan grup menggunakan usermod dengan solusi yang disebutkan.
Saya mencoba perintah berikut dari host buruh pelabuhan , dan dari wadah buruh pelabuhan yang sedang beroperasi :
(Saya masuk ke wadah buruh pelabuhan berjalan dengan perintah berikut dari tuan buruh pelabuhan :
)
Diterima dari buruh pelabuhan :
Diterima dari buruh pelabuhan :
Saya tidak tahu kata sandinya.
Tanpa
sudo
bagian dari perintah, dalam wadah buruh pelabuhan saya menerima:Solusi: Saya masuk ke wadah buruh pelabuhan yang berjalan dari host buruh pelabuhan dengan perintah berikut:
Sekarang, saya masuk sebagai root , dan mengeluarkan perintah berikut:
Kemudian, dari host buruh pelabuhan , saya memulai kembali wadah buruh pelabuhan saya yang sedang berjalan dengan perintah berikut:
Setelah itu, saya memulai pekerjaan jenkins dan selesai dengan sukses.
Saya hanya menggunakan pengguna root untuk mengeluarkan
usermod
perintah untuk penggunajenkins
.sumber
2019-05-26
Ini berhasil untuk saya!
Contoh susunan buruh pelabuhan:
sumber
Saya menghadapi masalah serupa, yang merupakan masalah perizinan dan penyebab masalah ini adalah karena daemon Docker / server selalu berjalan sebagai
root
pengguna, dan ingin Anda untuk selalu mengawali perintah docker dengannyasudo
.Daemon Docker mengikat ke soket Unix bukan port TCP. Secara default soket Unix dimiliki oleh pengguna
root
dan pengguna lain hanya dapat mengaksesnya menggunakansudo
.Untuk memperbaikinya, inilah yang bekerja untuk saya:
Pertama, periksa apakah Anda memiliki grup buruh pelabuhan yang sudah dibuat:
Jika Anda tidak menemukan
docker
dalam daftar yang ditampilkan, maka Anda harus membuatnya:Selanjutnya, konfirmasikan Anda
user
dan Andagroup
menggunakan perintah di bawah ini:Gulir ke seluruh untuk melihat grup untuk buruh pelabuhan. Seharusnya dari format ini
dimana
docker
akugroup
danpromisepreston
akuuser
Sekarang kami dapat menambahkan pengguna Anda ke grup buruh pelabuhan
Hanya untuk File Kontainer Docker:
Salin dan jalankan perintah di bawah ini di terminal Anda persis seperti yang dinyatakan tanpa memodifikasinya, terlepas dari gambar docker / wadah / perintah yang ingin Anda jalankan atau sedang coba jalankan atau sedang melemahkan masalah izin:
Setelah menjalankan perintah di atas, Anda harus keluar dan masuk kembali sehingga keanggotaan grup Anda dievaluasi kembali. Namun, di Linux, Anda juga dapat menjalankan perintah berikut di bawah ini untuk mengaktifkan perubahan pada grup ( Salin dan jalankan perintah di bawah ini di terminal Anda persis bagaimana hal itu dinyatakan tanpa mengubahnya dengan cara apa pun, terlepas dari gambar docker / wadah / perintah yang Anda ingin menjalankan atau mencoba menjalankan atau sedang mengesampingkan masalah izin ):
Anda sekarang dapat memverifikasi bahwa Anda dapat menjalankan perintah buruh pelabuhan tanpa izin sudo, dengan menjalankan perintah yang menyebabkan masalah izin lagi, katakan ( Ganti
my-command
dengan nama gambar / wadah / perintah Anda ):Untuk file sistem file Docker dan Lokal:
Jika Anda memiliki salinan file di sistem file lokal Anda, maka Anda dapat mengubah kepemilikan direktori aplikasi tempat file aplikasi disimpan, menggunakan format ini:
Jadi dalam kasus saya adalah:
Catatan: Silakan jalankan perintah ini di dalam direktori induk yang menampung direktori aplikasi.
Itu saja.
saya harap ini membantu
sumber
sumber
Saya menjalankan Jenkins di dalam wadah buruh pelabuhan. Solusi paling sederhana bagi saya adalah membuat gambar khusus yang secara dinamis mengatur GID, seperti:
Lihat: https://github.com/jenkinsci/docker/issues/263
Atau Anda dapat meluncurkan jenkins dengan opsi berikut:
Ini mengasumsikan gambar jenkins Anda memiliki klien docker diinstal. Lihat: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
sumber
Jika Anda mendapatkan kesalahan seperti di bawah ini,
atau
Coba saja jalankan perintah berikut,
sumber
usermod -a -G docker jenkins
danchown jenkins:docker /var/run/docker.sock
Saya menggunakan gambar docker jenkins resmi ( https://hub.docker.com/r/jenkins/jenkins ) tapi saya pikir solusi ini berlaku untuk sebagian besar kasus penggunaan di mana kami ingin menjalankan Docker di dalam wadah Docker.
Cara yang disarankan untuk menggunakan Docker di dalam wadah Docker, adalah dengan menggunakan deamon Docker dari sistem host. Artikel bagus mengenai hal itu: https://itnext.io/docker-in-docker-521958d34efd .
Rahasia untuk menangani masalah izin, tentang pertanyaan ini, adalah menambahkan izin untuk pengguna wadah di dalam wadah, bukan sistem host . Hanya pengguna root yang memiliki izin untuk melakukannya secara default, jadi
akan melakukannya. Ingatlah untuk memulai kembali wadah.
Saya kira cara paling sederhana untuk mencapai ini adalah dengan membuat Dockerfile yang disesuaikan:
sumber
Jika seseorang masih menghadapi masalah pada mesin lokal mereka (Ubuntu) maka coba perintah di bawah ini:
sumber
Dalam kasus saya ini akan berhasil. navigasi repo lokal Anda dan masukkan perintah ini.
sumber
Di server tempat Jenkins berjalan, saya menggunakan
Dan kemudian jalankan setiap wadah buruh pelabuhan dengan
Menggunakan setfacl tampaknya merupakan pilihan yang lebih baik, dan tidak ada "-u user" yang dibutuhkan. Kontainer kemudian dijalankan sebagai pengguna yang sama yang menjalankan Jenkins. Tapi saya akan sangat menghargai umpan balik dari para pakar keamanan.
sumber
gunakan di bawah dockerfile
sumber
dalam kasus saya itu baru memulai layanan buruh pelabuhan:
sumber
sering kali perlu reboot untuk memengaruhi kelompok pengguna dan pengguna baru.
sumber
Jika Anda menjalankan Jenkins di dalam wadah buruh pelabuhan dan Jenkins Anda terhubung ke buruh pelabuhan tuan rumah maka Anda dapat memperbaikinya hanya dengan Dockerfile di bawah ini:
sumber
Mungkin Anda harus menjalankan buruh pelabuhan dengan opsi "-u root" dari awal
Setidaknya itu menyelesaikan masalah saya
sumber
root
. Setidaknya inilah yang terjadi pada saya, dengan Docker 18.06.1.