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?


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


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 

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.



23

Saya bisa membuatnya bekerja dengan perintah di bawah ini.

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

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

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


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:

9

Untuk membuat / mengubah kata sandi root dalam wadah yang berjalan

docker exec -itu root {containerName} passwd

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.


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.


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

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.


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

0

coba perintah berikut untuk mendapatkan akses root

$ sudo -i 

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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.