Root mật khẩu bên trong một Docker container


265

Tôi đang sử dụng hình ảnh Docker được xây dựng bằng lệnh USER để sử dụng người dùng không phải root dev. Trong một container, tôi là "dev", nhưng tôi muốn chỉnh sửa /etc/hoststập tin.

Vì vậy, tôi cần phải được root. Tôi đang thử lệnh su, nhưng tôi được yêu cầu nhập mật khẩu gốc.

Mật khẩu người dùng root mặc định trong container Docker là gì?


11
chỉ cần thực hiện như một root : docker exec -u 0 -it mycontainer bash. (xem H6câu trả lời)
Sławomir Lenart

Câu trả lời:


495

Bạn có thể đăng nhập vào bộ chứa Docker bằng người dùng root (ID = 0) thay vì người dùng mặc định được cung cấp khi bạn sử dụng -utùy chọn. Ví dụ

docker exec -u 0 -it mycontainer bash

root (id = 0) là người dùng mặc định trong một container. Nhà phát triển hình ảnh có thể tạo thêm người dùng. Những người dùng có thể truy cập bằng tên. Khi truyền ID số, ​​người dùng không phải tồn tại trong vùng chứa.

từ tài liệu Docker


5
Sẽ thật tuyệt khi xác định rằng bạn cần mycontainer và chạy vào lúc này khi bạn gõ dấu phẩy trên. nó hoạt động bằng cách sử dụng 2 thiết bị đầu cuối khác nhau: một cho mycontainer và một cho lệnh này. Mặt khác, nó yêu cầu mycontainer đang chạy như tách ra.
nicolimo86

6
đối với hình ảnh, hãy sử dụngdocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky

2
đây là câu trả lời nên được đặt lên hàng đầu
D Pinto

1
@ High6, khi bạn nói "Bạn có thể đăng nhập vào Docker Image ...", tôi nghĩ bạn có nghĩa là "Bạn có thể đăng nhập vào Docker Container ".
lmiguelvargasf

Điều này luôn luôn có thể? Hoặc điều này có thể bị chặn?
Sam Thomas

82

Cuối cùng, tôi quyết định xây dựng lại hình ảnh Docker của mình, để tôi thay đổi mật khẩu gốc bằng một cái gì đó tôi sẽ biết.

RUN echo 'root:Docker!' | chpasswd

hoặc là

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

5
Tôi đã thử điều này nhưng nó không hoạt động trên docker dựa trên CentOS 6 của tôi. Lệnh này có hoạt động trên docker dựa trên CentOS không?
Dragan Nikolic

28

Có một vài cách để làm điều đó.

  1. Để chạy Docker ghi đè cài đặt USER

    docker exec -u 0 -it containerName bash
    

hoặc là

docker exec -u root -it --workdir / <containerName> bash
  1. Tạo quyền truy cập tệp cần thiết, v.v., trong quá trình tạo hình ảnh trong tệp Docker

  2. Nếu tất cả các gói có sẵn trong hình ảnh Linux của bạn, chpasswdtrong dockerfile trước tiện ích USER.



23

Tôi có thể làm cho nó hoạt động với lệnh dưới đây.

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

18

Tôi đã có chính xác vấn đề này về việc không thể root để root vì tôi đang chạy trong container với tư cách là một người dùng không có quyền.

Nhưng tôi không muốn xây dựng lại một hình ảnh mới như các câu trả lời trước đây cho thấy.

Thay vào đó, tôi thấy rằng tôi có thể truy cập container dưới dạng root bằng cách sử dụng 'nsenter', xem: https://github.com/jpetazzo/nsenter

Trước tiên, xác định PID của container của bạn trên máy chủ:

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

Sau đó sử dụng nsenter để vào container làm root

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

1
Sử dụng boot2docker, tôi đã phải sử dụngsudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater

Vâng, điểm tốt. Bạn thường cần quyền root để thực thi các lệnh docker và tôi đoán nsenter là như nhau. Tôi đã không làm điều này hoàn toàn rõ ràng trong câu trả lời của tôi.
Richard Corfield

4
Vì câu trả lời này đã được viết, docker đã thêm lệnh exec để thực hiện cơ bản giống như nsenter, nhưng dễ dàng và sạch sẽ hơn. Chỉ là một điểm dữ liệu cho những người bây giờ tìm thấy câu hỏi này thông qua tìm kiếm. Lệnh này là "docker exec -it <containerername> <lệnh>" (lệnh thường là / bin / bash, nhưng tất nhiên bạn có thể làm bất cứ điều gì bạn muốn).
Kevin Keane

Ngoài ra, docker có cách xử lý đặc biệt cho máy chủ (và decv.conf). Bạn không nên tự chỉnh sửa chúng; docker tạo lại / etc / hosts mỗi khi bắt đầu để phản ánh các container được liên kết và tương tự.
Kevin Keane


9

Lấy một vỏ của container đang chạy của bạn và thay đổi mật khẩu gốc:

docker exec -it <MyContainer> bash

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

9

Để tạo / thay đổi mật khẩu gốc trong một container đang chạy

docker exec -itu root {containerName} passwd

5

Mật khẩu là 'ubfox' cho người dùng 'ubfox' (ít nhất là trong docker cho ubfox: 14.04.03).

NB: 'ubfox' được tạo sau khi khởi động container, nếu bạn chỉ cần làm điều này:

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

Bạn sẽ nhận được lời nhắc gốc trực tiếp. Từ đó, bạn có thể buộc thay đổi mật khẩu của root, cam kết vùng chứa và tùy ý gắn thẻ (với -f) vào ubfox: mới nhất như thế này:

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

Bạn phải xây dựng lại các phụ thuộc cuối cùng của mình trên Ubuntu: mới nhất.


3

Tôi muốn đề xuất một giải pháp tốt hơn là đưa ra --add-host NAME:IPđối số để chạy docker khi khởi động container. Điều đó sẽ cập nhật các /etc/hosts/tập tin mà không cần phải trở thành root.

Nếu không, bạn có thể ghi đè USERcài đặt bằng cách đưa -u USERcờ đến docker run. Tuy nhiên, tôi sẽ khuyên bạn không nên thay đổi mọi thứ trong một container đang chạy. Thay vào đó, hãy thực hiện các thay đổi của bạn trong Dockerfile và xây dựng một hình ảnh mới.


Tôi cần thêm các mục trong tệp máy chủ trong khi container đang chạy.
guillaume

Tôi cũng cần cài đặt gói mới, nhưng tôi không thể root được.
guillaume

1
Bạn có thể sử dụng -ucờ để thay đổi người dùng. Tôi không nghĩ bạn có thể làm điều đó từ bên trong container.
Adrian Mouat


2

Khi bạn khởi động container, bạn sẽ root nhưng bạn sẽ không biết pw của root là gì. Để đặt nó thành một cái gì đó bạn biết chỉ cần sử dụng "root passwd". Ảnh chụp / cam kết container để lưu hành động của bạn.


1

Theo mặc định, các container docker chạy như root người dùng.

Nếu bạn vẫn đang sử dụng container, bạn có thể sử dụng exitlệnh để quay lạiroot người dùng (người dùng mặc định) thay vì chạy lại vùng chứa.

Thí dụ -

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

0

thử lệnh sau để có quyền truy cập root

$ sudo -i 

Điều này không có khả năng hoạt động trừ khi bạn có tài khoản trong thiết lập vùng chứa với quyền truy cập sudo. Đây sẽ là một tình huống bất thường và phá vỡ quan điểm có một người dùng không root đang chạy container.
Giô

Bất cứ ai cũng biết mật khẩu su DEFAULT cho cài đặt Docker? Tôi đã cố chạy độ cao và có một bộ.
Patrick Burwell

Điều này hoạt động trong WSL2 sau khi xuất hình ảnh docker và nhập vào WSL2. Từ đó, chỉ cần làm passwd để đặt mật khẩu cho root. Thoát trở lại người dùng không root và thử sudo su hoặc su. Bây giờ nó sẽ hoạt động.
WSLUser

0

Trong một số trường hợp, bạn cần có khả năng thực hiện những việc như vậy theo người dùng sudo(ví dụ: ứng dụng đang chạy trong vùng chứa cung cấp vỏ cho người dùng). Chỉ cần thêm cái này vào Dockerfile của bạn:

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

Bây giờ, dưới người dùng hình ảnh mặc định, userbạn sẽ có thể sudovới mật khẩu được đặt trên dòng 3.

Xem cách tạo mật khẩu băm cho useradd tại đây hoặc tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.