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?
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?
su user_name
Câu trả lời:
Đố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 attach
hoặ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ì
run --user <user>
hoặc đề cập đến nó trong việc Dockerfile
sử dụng của bạnUSER
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
--user
Tô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.
USER
hướng dẫn, xem docs.docker.com/engine/reference/builder/#user
Bạn có thể chỉ định USER
trong 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 USER
một dòng trước CMD
hoặc ENTRYPOINT
nế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á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.
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 /cmd
bê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-image
chứ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.sh
là kịch bản hiển thị ở trên. Các addgroup/useradd
má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ế ...
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"
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/
Đ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
docker run --user user_name