Rooting kata sandi di dalam wadah Docker

265

Saya menggunakan gambar Docker yang dibangun menggunakan perintah USER untuk menggunakan pengguna non-root yang disebut dev. Di dalam sebuah wadah, saya "dev", tetapi saya ingin mengedit /etc/hostsfile.

Jadi saya harus menjadi root. Saya mencoba perintah su, tetapi saya diminta untuk memasukkan kata sandi root.

Apa kata sandi pengguna root default di dalam wadah Docker?

guillaume
sumber
11
hanya exec sebagai root: docker exec -u 0 -it mycontainer bash. (lihat H6jawaban)
Sławomir Lenart

Jawaban:

495

Anda dapat masuk ke wadah Docker menggunakan pengguna root (ID = 0) alih-alih pengguna default yang disediakan saat Anda menggunakan -uopsi. Misalnya

docker exec -u 0 -it mycontainer bash

root (id = 0) adalah pengguna default dalam sebuah wadah. Pengembang gambar dapat membuat pengguna tambahan. Para pengguna dapat diakses dengan nama. Saat melewati ID numerik, pengguna tidak harus ada di wadah.

dari dokumentasi Docker

H6.
sumber
5
Akan lebih baik untuk menentukan bahwa Anda perlu mycontainer aktif dan berjalan saat Anda mengetikkan commad di atas. ini bekerja menggunakan 2 terminal berbeda: satu untuk mycontainer dan yang lainnya untuk perintah ini. Kalau tidak, itu mengharuskan mycontainer berjalan terpisah.
nicolimo86
6
untuk gambar, gunakandocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky
2
inilah jawaban yang seharusnya ada di atas
D Pinto
1
@ High6, ketika Anda mengatakan "Anda dapat masuk ke Docker Image ...", saya pikir maksud Anda "Anda dapat masuk ke Docker Container ".
lmiguelvargasf
Apakah ini selalu mungkin? Atau bisakah ini diblokir?
Sam Thomas
82

Akhirnya, saya memutuskan untuk membangun kembali gambar Docker saya, sehingga saya mengubah kata sandi root dengan sesuatu yang akan saya ketahui.

RUN echo 'root:Docker!' | chpasswd

atau

RUN echo 'Docker!' | passwd --stdin root 
guillaume
sumber
5
Saya mencoba ini tetapi tidak berfungsi pada buruh pelabuhan berbasis CentOS 6 saya. Apakah perintah ini berfungsi pada buruh pelabuhan berbasis CentOS?
Dragan Nikolic
28

Ada beberapa cara untuk melakukannya.

  1. Untuk menjalankan Docker, mengesampingkan pengaturan USER

    docker exec -u 0 -it containerName bash
    

atau

docker exec -u root -it --workdir / <containerName> bash
  1. Buat izin file yang diperlukan, dll., Selama pembuatan gambar di file Docker

  2. Jika semua paket tersedia di gambar Linux Anda, chpasswddi dockerfile sebelum utilitas USER.

Muralidharan.rade
sumber
23

Saya bisa membuatnya bekerja dengan perintah di bawah ini.

root@gitnew:# docker exec -it --user $(username) $(containername) /bin/bash
Mansur Ali
sumber
18

Saya benar-benar memiliki masalah ini karena tidak dapat melakukan su ke root karena saya menjalankan dalam wadah sebagai pengguna yang tidak memiliki hak.

Tetapi saya tidak ingin membangun kembali gambar baru seperti yang disarankan oleh jawaban sebelumnya.

Sebaliknya saya menemukan bahwa saya dapat mengakses wadah sebagai root menggunakan 'nsenter', lihat: https://github.com/jpetazzo/nsenter

Pertama-tama tentukan PID wadah Anda di host:

docker inspect --format {{.State.Pid}} <container_name_or_ID>

Kemudian gunakan nsenter untuk memasukkan wadah sebagai root

nsenter --target <PID> --mount --uts --ipc --net --pid
Richard Corfield
sumber
1
Menggunakan boot2docker, saya harus menggunakansudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater
Ya, poin bagus. Anda biasanya memerlukan izin root untuk menjalankan perintah buruh pelabuhan dan saya kira nsenter adalah sama. Saya tidak memperjelas jawaban saya.
Richard Corfield
4
Sejak jawaban ini ditulis, buruh pelabuhan telah menambahkan perintah exec untuk melakukan hal yang pada dasarnya sama dengan nsenter, tetapi lebih mudah dan bersih. Hanya titik data bagi mereka yang sekarang menemukan pertanyaan ini melalui pencarian. Perintahnya adalah "docker exec -it <containername> <command>" (perintah biasanya / bin / bash, tetapi tentu saja Anda dapat melakukan apa pun yang Anda inginkan).
Kevin Keane
Juga, buruh pelabuhan memiliki perlakuan khusus untuk host (dan resolv.conf). Anda tidak boleh mengeditnya secara manual; buruh pelabuhan membuat ulang / etc / hosts di setiap awal untuk mencerminkan wadah terkait dan sejenisnya.
Kevin Keane
18
docker exec -u 0 -it containername bash
pengguna128364
sumber
9

Dapatkan shell dari wadah Anda yang sedang berjalan dan ubah kata sandi root:

docker exec -it <MyContainer> bash

root@MyContainer:/# passwd
Enter new UNIX password:
Retype new UNIX password:
DimiDak
sumber
9

Untuk membuat / mengubah kata sandi root dalam wadah yang berjalan

docker exec -itu root {containerName} passwd
Pd bulan depan
sumber
5

Kata sandi adalah 'ubuntu' untuk pengguna 'ubuntu' (setidaknya di docker untuk ubuntu: 14.04.03).

NB: 'ubuntu' dibuat setelah memulai wadah jadi, jika Anda hanya melakukan ini:

 docker run -i -t --entrypoint /bin/bash  ubuntu     

Anda akan mendapatkan prompt root secara langsung. Dari sana Anda dapat memaksakan perubahan kata sandi root, komit wadah dan secara opsional beri tag (dengan -f) ke ubuntu: terbaru seperti ini:

root@ec384466fbbb:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@ec384466fbbb:~# exit

% docker commit ec3844
5d3c03e7d6d861ce519fe33b184cd477b8ad03247ffe19b2a57d3f0992d71bca

docker tag -f 5d3c ubuntu:latest

Anda harus membangun kembali dependensi akhirnya di ubuntu: terbaru.

pengguna1853859
sumber
3

Saya menyarankan solusi yang lebih baik adalah memberikan --add-host NAME:IPargumen untuk menjalankan buruh pelabuhan ketika memulai wadah. Itu akan memperbarui /etc/hosts/file tanpa perlu menjadi root.

Jika tidak, Anda dapat mengganti USERpengaturan dengan memberikan -u USERbendera docker run. Saya akan menyarankan menentang ini, karena Anda tidak harus benar-benar mengubah hal-hal dalam wadah berjalan. Sebagai gantinya, buat perubahan Anda di Dockerfile dan buat gambar baru.

Adrian Mouat
sumber
Saya perlu menambahkan entri dalam file host saat wadah sedang berjalan.
guillaume
Saya juga perlu menginstal paket baru, tetapi saya tidak bisa karena saya tidak root.
guillaume
1
Anda dapat menggunakan -ubendera untuk mengubah pengguna. Saya tidak berpikir Anda bisa melakukannya dari dalam wadah.
Adrian Mouat
2

Anda dapat menggunakan perintah root USER di Dockerfile Anda.

naveen kumar
sumber
2

Saat Anda memulai wadah, Anda akan menjadi root tetapi Anda tidak akan tahu apa itu root. Untuk mengaturnya menjadi sesuatu yang Anda tahu cukup gunakan "passwd root". Bidik / komit wadah untuk menyimpan tindakan Anda.

JohnBabrick
sumber
1

Secara default, buruh pelabuhan menjalankan wadah sebagai root pengguna.

Jika Anda masih menggunakan wadah, Anda dapat menggunakan exitperintah untuk kembaliroot pengguna (pengguna default) alih-alih menjalankan wadah lagi.

Contoh -

[dev@6c4c86bccf93 ~]$ ls
[dev@6c4c86bccf93 ~]$ other-commands..
[dev@6c4c86bccf93 ~]$ exit
[root@6c4c86bccf93 /]# ls
Mithilesh Tipkari
sumber
0

coba perintah berikut untuk mendapatkan akses root

$ sudo -i 
Abhishek DK
sumber
Ini tidak akan berhasil kecuali Anda memiliki akun di pengaturan wadah dengan akses sudo. Ini akan menjadi situasi yang tidak biasa dan mematahkan titik memiliki pengguna non-root menjalankan wadah.
Yosia
Adakah yang tahu kata sandi DEFAULT untuk Docker instal? Saya mencoba untuk menjalankan ketinggian dan ada satu set.
Patrick Burwell
Ini bekerja di WSL2 setelah mengekspor gambar buruh pelabuhan dan mengimpor ke WSL2. Dari sana, lakukan passwd untuk mengatur kata sandi untuk root. Keluar kembali ke pengguna non-root dan coba sudo su atau su. Sekarang akan berfungsi.
WSLUser
0

Dalam beberapa kasus, Anda harus dapat melakukan hal-hal seperti itu di bawah pengguna dengan sudo(misalnya aplikasi yang berjalan dalam wadah menyediakan shell untuk pengguna). Cukup tambahkan ini ke Anda Dockerfile:

RUN apt-get update         # If necessary
RUN apt-get install sudo   # If your base image does not contain sudo.
RUN useradd -m -N -s /bin/bash -u 1000 -p '$1$miTOHCYy$K.c4Yw.edukWJ7z9rbpTZ0' user && \
    usermod -aG sudo user  # Grant sudo to the user
USER user

Sekarang di bawah pengguna gambar default userAnda akan dapatsudo dengan kata sandi yang ditetapkan pada baris 3.

Lihat cara membuat hash kata sandi untuk di useradd sini atau di sini .

greatvovan
sumber