Kết nối với vùng chứa docker với tư cách là người dùng không phải root


84

THEO mặc định khi bạn chạy

docker run -it [myimage]

HOẶC LÀ

docker attach [mycontainer]

bạn kết nối với thiết bị đầu cuối với tư cách người dùng gốc, nhưng tôi muốn kết nối với tư cách người dùng khác. Điều này có khả thi không?


3
Đúng. docker run --user user_name
Xiongbing Jin

1
Không có tùy chọn như vậy cho phần đính kèm. Bạn sẽ phải đăng nhập bằng quyền root và sau đósu user_name
Xiongbing Jin

Câu trả lời:


93

Đối với docker run:

Chỉ cần thêm tùy chọn --user <user>để thay đổi thành người dùng khác khi bạn khởi động vùng chứa docker.

docker run -it --user nobody busybox

Đối với docker attachhoặc docker exec:

Vì lệnh được sử dụng để đính kèm / thực thi vào tiến trình hiện có, do đó nó sử dụng trực tiếp người dùng hiện tại ở đó.

docker run -it busybox  # CTRL-P/Q to quit
docker attach <container id>  # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)

docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>  
/ $ id
uid=99(nobody) gid=99(nogroup)

Nếu bạn thực sự muốn đính kèm với người dùng mà bạn muốn có, thì

  1. bắt đầu với người dùng đó run --user <user>hoặc đề cập đến nó trong việc Dockerfilesử dụng của bạnUSER
  2. thay đổi người dùng bằng cách sử dụng `su

71

Bạn có thể chạy một trình bao trong một bộ chứa docker đang chạy bằng lệnh như:

docker exec -it --user root <container id> /bin/bash


2
root là người dùng mặc định. --userTôi cho rằng tùy chọn này có thể bị bỏ qua khi các lệnh phải được chạy dưới dạng root.
Stphane

7
@Stphane không phải lúc nào cũng vậy vì người dùng mặc định có thể được tùy chỉnh trong Dockerfile thông qua USERhướng dẫn, xem docs.docker.com/engine/reference/builder/#user
ryenus

5

Bạn có thể chỉ định USERtrong Dockerfile. Tất cả các hành động tiếp theo sẽ được thực hiện bằng tài khoản đó. Bạn có thể chỉ định USERmột dòng trước CMDhoặc ENTRYPOINTnếu bạn chỉ muốn sử dụng người dùng đó khi khởi chạy vùng chứa (chứ không phải khi xây dựng hình ảnh). Khi bạn bắt đầu một vùng chứa từ hình ảnh kết quả, bạn sẽ đính kèm với tư cách là người dùng được chỉ định.


Cũng đừng bao giờ quên đặt TRANG CHỦ
karthik101 23/07/18

2

Cách duy nhất tôi có thể làm cho nó hoạt động là:

docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus

Vì vậy, tôi phải chỉ định cả biến môi trường $ USER cũng như một điểm cho tệp / etc / passwd. Bằng cách này, tôi có thể biên dịch trong thư mục / siem và giữ quyền sở hữu các tệp ở đó không phải là root.


Không hoạt động 'như hiện tại' nhưng hướng tôi đến giải pháp làm việc. Cảm ơn bạn!
Josef Sábl

1

Giải pháp của tôi:

#!/bin/bash
user_cmds="$@"

GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID  $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT

trap "rm -rf $RUN_SCRIPT" EXIT

docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"

Điều này cho phép người dùng chạy các lệnh tùy ý bằng cách sử dụng các công cụ được cung cấp bởi my-docker-image. Lưu ý cách thư mục làm việc hiện tại của người dùng được gắn vào ổ đĩa /cmdbên trong vùng chứa.

Tôi đang sử dụng quy trình làm việc này để cho phép nhóm phát triển của mình biên dịch chéo mã C / C ++ cho đích arm64, có bsp mà tôi duy trì ( my-docker-imagechứa trình biên dịch chéo, sysroot, make, cmake, v.v.). Với điều này, người dùng có thể chỉ cần làm một số việc như:

cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"

Trong trường hợp cross_compile.shlà kịch bản hiển thị ở trên. Các addgroup/useraddmáy móc thiết bị cho phép người sử dụng sở hữu của bất kỳ tập tin / thư mục được tạo ra bởi việc xây dựng.

Trong khi điều này làm việc cho chúng tôi. Nó có vẻ như là một loại hacky. Tôi sẵn sàng cho các triển khai thay thế ...


0

Thực thi lệnh với tư cách người dùng www-data: docker exec -t --user www-data container bash -c "ls -la"


0

Đối với docker-compose. Trong docker-compose.yml:

version: '3'
services:
    app:
        image: ...
        user: ${UID:-0}
...

Trong .env:

UID=1000

0

Như một câu trả lời được cập nhật từ năm 2020. Tùy chọn --user, -u là Tên người dùng hoặc UID (định dạng: <name | uid> [: <group | gid>]).

Sau đó, nó hoạt động với tôi như thế này,

docker exec -it -u root:root container /bin/bash

Tham khảo: https://docs.docker.com/engine/reference/commandline/exec/


0

Điều này đã giải quyết trường hợp sử dụng của tôi đó là: "Biên dịch nội dung webpack trong vùng chứa nodejs trên Windows chạy Docker Desktop với WSL2 và có các nội dung được xây dựng dưới người dùng hiện đang đăng nhập của bạn."

docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'

Dựa trên câu trả lời của eigenfield . Cảm ơn bạn!

Ngoài ra tài liệu này đã giúp tôi hiểu những gì đang xảy ra

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.