รหัสผ่านรูทภายในคอนเทนเนอร์ Docker


265

ฉันใช้อิมเมจ Docker ซึ่งสร้างโดยใช้คำสั่ง USER เพื่อใช้ผู้ใช้ที่ไม่ใช่รูdevท ข้างในคอนเทนเนอร์ฉัน "dev" แต่ฉันต้องการแก้ไข/etc/hostsไฟล์

ดังนั้นฉันต้องเป็นคนรูท ฉันพยายามใช้คำสั่ง su แต่ขอให้ป้อนรหัสผ่านรูท

รหัสผ่านเริ่มต้นของผู้ใช้รูทภายในคอนเทนเนอร์ Docker คืออะไร


11
เพียงแค่ดำเนินการในฐานะรูท: docker exec -u 0 -it mycontainer bash. (ดูH6คำตอบของ)
Sławomir Lenart

คำตอบ:


494

คุณสามารถล็อกอินเข้าสู่คอนเทนเนอร์ Docker โดยใช้ผู้ใช้รูท (ID = 0) แทนที่จะเป็นผู้ใช้เริ่มต้นที่ระบุเมื่อคุณใช้-uตัวเลือก เช่น

docker exec -u 0 -it mycontainer bash

root (id = 0) เป็นผู้ใช้เริ่มต้นภายในคอนเทนเนอร์ ผู้พัฒนารูปภาพสามารถสร้างผู้ใช้เพิ่มเติม ผู้ใช้เหล่านั้นสามารถเข้าถึงได้โดยใช้ชื่อ เมื่อส่ง ID ตัวเลขผู้ใช้ไม่จำเป็นต้องมีอยู่ในคอนเทนเนอร์

จากเอกสารนักเทียบท่า


5
มันเป็นการดีที่จะระบุว่าคุณต้องการ mycontainer และทำงานในขณะนี้เมื่อคุณพิมพ์คอมม่าด้านบน ใช้งานได้กับเทอร์มินัล 2 แบบ: สำหรับ mycontainer และอีกอันสำหรับคำสั่งนี้ มิฉะนั้นจะต้องให้ mycontainer ทำงานเป็นเดี่ยว
nicolimo86

6
สำหรับรูปภาพใช้docker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky

2
นี่คือคำตอบที่ควรจะอยู่ด้านบน
D Pinto

1
@ High6 เมื่อคุณพูดว่า "คุณสามารถเข้าสู่ระบบ Docker Image ... " ฉันคิดว่าคุณหมายถึง "คุณสามารถเข้าสู่ Docker Container "
lmiguelvargasf

เป็นไปได้เสมอหรือไม่ หรือสิ่งนี้จะถูกบล็อก?
แซมโทมัส

82

ในที่สุดฉันตัดสินใจสร้างอิมเมจ Docker ขึ้นใหม่เพื่อที่ฉันจะเปลี่ยนรหัสผ่านรูทด้วยบางสิ่งที่ฉันจะรู้

RUN echo 'root:Docker!' | chpasswd

หรือ

RUN echo 'Docker!' | passwd --stdin root 

5
ฉันลองสิ่งนี้ แต่มันไม่ทำงานบน Docker ที่ใช้ CentOS 6 คำสั่งนี้ใช้งานได้กับ CentOS based docker หรือไม่?
Dragan Nikolic

28

มีสองวิธีที่จะทำ

  1. หากต้องการเรียกใช้งาน Docker ให้ยกเลิกการตั้งค่า USER

    docker exec -u 0 -it containerName bash
    

หรือ

docker exec -u root -it --workdir / <containerName> bash
  1. ให้สิทธิ์ไฟล์ที่จำเป็น ฯลฯ ระหว่างการสร้างอิมเมจในไฟล์ Docker

  2. หากแพ็กเกจทั้งหมดพร้อมใช้งานในอิมเมจ Linux ของคุณchpasswdใน dockerfile ก่อนยูทิลิตี้ USER




18

ฉันมีปัญหาตรงนี้ที่ฉันไม่สามารถรูทได้เพราะฉันทำงานในที่เก็บในฐานะผู้ใช้ที่ไม่มีสิทธิ์

แต่ฉันไม่ต้องการสร้างภาพใหม่ตามคำแนะนำก่อนหน้านี้

ฉันพบว่าฉันสามารถเข้าถึงคอนเทนเนอร์ในฐานะรูทโดยใช้ 'nsenter' แทนได้ที่ https://github.com/jpetazzo/nsenter

ก่อนอื่นให้กำหนด PID ของคอนเทนเนอร์ของคุณบนโฮสต์:

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

จากนั้นใช้ nsenter เพื่อป้อนคอนเทนเนอร์เป็น root

nsenter --target <PID> --mount --uts --ipc --net --pid

1
ใช้ boot2docker ฉันต้องใช้sudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater

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

4
เนื่องจากคำตอบนี้ถูกเขียนขึ้นนักเทียบท่าได้เพิ่มคำสั่ง exec ให้ทำโดยพื้นฐานเหมือนกับ nsenter แต่ง่ายกว่าและสะอาดกว่า เป็นเพียงจุดข้อมูลสำหรับผู้ที่ค้นหาคำถามนี้ผ่านการค้นหา คำสั่งคือ "นักเทียบท่า exec -it <containername> <command>" (คำสั่งมักจะเป็น / bin / bash แต่แน่นอนคุณสามารถทำสิ่งที่คุณต้องการ)
Kevin Keane

นอกจากนี้นักเทียบท่ายังมีการดูแลเป็นพิเศษสำหรับโฮสต์ (และ resolv.conf) คุณไม่ควรแก้ไขด้วยตนเอง นักเทียบท่าจะสร้าง / etc / hosts ทุกครั้งที่เริ่มต้นเพื่อสะท้อนถึงคอนเทนเนอร์ที่เชื่อมโยงและสิ่งที่คล้ายกัน
Kevin Keane


9

รับเชลล์ของคอนเทนเนอร์ที่รันอยู่และเปลี่ยนรหัสผ่านรูท:

docker exec -it <MyContainer> bash

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


5

รหัสผ่านคือ 'ubuntu' สำหรับผู้ใช้ 'ubuntu' (อย่างน้อยก็ใน docker สำหรับ ubuntu: 14.04.03)

หมายเหตุ: 'อูบุนตู' ถูกสร้างขึ้นหลังจากการเริ่มต้นของคอนเทนเนอร์ดังนั้นหากคุณทำสิ่งนี้:

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

คุณจะได้รับพรอมต์รูทโดยตรง จากตรงนี้คุณสามารถบังคับให้เปลี่ยนรหัสผ่านของรูท, คอมมิทคอนเทนเนอร์และติดแท็กทางเลือก (ด้วย -f) ไปยัง Ubuntu: ล่าสุดอย่างนี้:

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

คุณต้องสร้างการอ้างอิงในที่สุดของคุณบน Ubuntu: ล่าสุด


3

ฉันขอแนะนำวิธีแก้ปัญหาที่ดีกว่าคือให้--add-host NAME:IPอาร์กิวเมนต์แก่นักเรียกใช้เมื่อเริ่มต้นคอนเทนเนอร์ ที่จะอัปเดต/etc/hosts/ไฟล์โดยไม่จำเป็นต้องเป็นรูท

มิฉะนั้นคุณสามารถลบล้างการUSERตั้งค่าได้โดยให้-u USERแฟล็docker runก ฉันจะแนะนำกับสิ่งนี้อย่างไรก็ตามคุณไม่ควรเปลี่ยนแปลงสิ่งต่าง ๆ ในภาชนะที่กำลังทำงานอยู่ ให้ทำการเปลี่ยนแปลงใน Dockerfile แทนและสร้างภาพใหม่


ฉันต้องการเพิ่มรายการในไฟล์โฮสต์ในขณะที่คอนเทนเนอร์กำลังทำงาน
guillaume

ฉันต้องติดตั้งแพ็คเกจใหม่ แต่ไม่สามารถทำได้เพราะฉันไม่รูท
guillaume

1
คุณสามารถใช้การ -uตั้งค่าสถานะเพื่อเปลี่ยนผู้ใช้ ฉันไม่คิดว่าคุณสามารถทำได้จากในภาชนะ
Adrian Mouat


2

เมื่อคุณเริ่มต้นคอนเทนเนอร์คุณจะรูท แต่คุณจะไม่รู้ว่า pw ของรูทคืออะไร หากต้องการตั้งค่าเป็นสิ่งที่คุณรู้เพียงใช้ "passwd root" สแนปชอต / ส่งคอนเทนเนอร์เพื่อบันทึกการกระทำของคุณ


1

ตามค่าเริ่มต้นคอนเทนเนอร์นักเทียบท่าจะเรียกใช้ในฐานะrootผู้ใช้

หากคุณยังคงใช้คอนเทนเนอร์คุณสามารถใช้exitคำสั่งเพื่อกลับไปที่rootผู้ใช้ (ผู้ใช้เริ่มต้น) แทนที่จะเรียกใช้คอนเทนเนอร์อีกครั้ง

ตัวอย่าง -

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

0

ลองคำสั่งต่อไปนี้เพื่อรับสิทธิ์การเข้าถึงรูต

$ sudo -i 

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

ใครรู้ว่ารหัสผ่านเริ่มต้นสำหรับการติดตั้งนักเทียบท่า? ฉันพยายามเรียกใช้ระดับความสูงและมีหนึ่งชุด
Patrick Burwell

สิ่งนี้ทำงานใน WSL2 หลังจากส่งออกอิมเมจนักเทียบท่าและนำเข้าสู่ WSL2 จากนั้นเพียงทำ passwd เพื่อตั้งรหัสผ่านสำหรับรูท ออกจากผู้ใช้ที่ไม่ใช่รูทและลอง sudo su หรือ su ตอนนี้มันจะทำงาน
WSLUser

0

ในบางกรณีคุณต้องสามารถทำสิ่งต่าง ๆ ภายใต้ผู้ใช้ด้วยsudo(เช่นแอปพลิเคชันที่ทำงานอยู่ในคอนเทนเนอร์เป็นเชลล์สำหรับผู้ใช้) เพียงเพิ่มส่วนนี้ลงใน 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

ตอนนี้ภายใต้ผู้ใช้รูปภาพเริ่มต้นuserคุณจะสามารถsudoตั้งรหัสผ่านที่บรรทัดที่ 3 ได้

ดูวิธีการสร้างรหัสผ่านสำหรับกัญชาuseradd ที่นี่หรือที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.