Làm cách nào để thêm người dùng khi tôi đang sử dụng Alpine làm hình ảnh cơ sở?


107

Tôi đang sử dụng alpine(hoặc một hình ảnh dựa trên Alpine) làm hình ảnh cơ sở trong Dockerfile của mình. Tôi cần thêm hướng dẫn nào để tạo người dùng?

Cuối cùng, tôi sẽ sử dụng người dùng này để chạy ứng dụng mà tôi sẽ đặt vào vùng chứa để người dùng root thì không.

Câu trả lời:


221

Alpine sử dụng lệnh adduseraddgroupđể tạo người dùng và nhóm (thay vì useraddusergroup).

FROM alpine:latest

# Create a group and user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# Tell docker that all future commands should run as the appuser user
USER appuser

Các cờ cho adduserlà:

Cách sử dụng: adduser [OPTIONS] USER [GROUP]

Tạo người dùng mới hoặc thêm USER vào GROUP

        -h DIR Thư mục chính
        -g trường GECOS GECOS
        -s SHELL Đăng nhập shell
        -G GRP Group
        -S Tạo một người dùng hệ thống
        -Không chỉ định mật khẩu
        -H không tạo thư mục chính
        -u UID ID người dùng
        -k SKEL Thư mục Skeleton (/ etc / skel)

Thêm tài liệu chính thức của người dùng mới


7
Hoặc cách khác, bạn có thể thay thế toàn bộ đoạn mã ở trên bằng cách sử dụng đoạn mã này: USER 405là người dùng khách trong Alpine Linux.
Daniel Gartmann

8
Tại sao không USER guest?
user672009

3
Tôi muốn tạo người dùng mới vì tôi muốn người dùng đó có cùng UID / GID với người dùng trên hệ điều hành chủ để không có vấn đề về quyền khi chạy docker trong Linux. (không phải là một vấn đề với những người dùng hệ điều hành MacOS / Windows)
elquimista

5
Lưu ý rằng vì Alpine dựa trên BusyBox nên các lệnh adduseraddgrouplệnh của nó khác với adduseraddgroupnhư được cung cấp bởi Debian và Ubuntu, lần lượt là giao diện người dùng của useraddgroupadd. Đáng chú ý, các lệnh Debian và Ubuntu chỉ hỗ trợ các tùy chọn dạng dài. Xem: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack

Tôi đã tạo vùng chứa docker, bây giờ tôi cần chạy lệnh nào để thêm người dùng?
Aashish Kumar

65

Các lệnh là adduseraddgroup .

Đây là mẫu cho Docker mà bạn có thể sử dụng trong môi trường hộp bận rộn (núi cao) cũng như môi trường dựa trên Debian (Ubuntu, v.v.):

ENV USER=docker
ENV UID=12345
ENV GID=23456

RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "$(pwd)" \
    --ingroup "$USER" \
    --no-create-home \
    --uid "$UID" \
    "$USER"

Lưu ý những điều dưới đây:

  • --disabled-password ngăn chặn lời nhắc nhập mật khẩu
  • --gecos "" bỏ qua lời nhắc cho "Tên đầy đủ", v.v. trên các hệ thống dựa trên Debian
  • --home "$(pwd)"đặt nhà của người dùng thành WORKDIR. Bạn có thể không muốn điều này.
  • --no-create-home ngăn chặn việc sao chép cruft vào thư mục từ /etc/skel

Mô tả việc sử dụng cho các ứng dụng đang thiếu những lá cờ dài trình bày trong mã cho adduseraddgroup .

Các cờ dạng dài sau đây sẽ hoạt động cả trong alpine cũng như các dẫn xuất debian:

thêm người dùng

BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.

Usage: adduser [OPTIONS] USER [GROUP]

Create new user, or add USER to GROUP

        --home DIR           Home directory
        --gecos GECOS        GECOS field
        --shell SHELL        Login shell
        --ingroup GRP        Group (by name)
        --system             Create a system user
        --disabled-password  Don't assign a password
        --no-create-home     Don't create home directory
        --uid UID            User id

Một điều cần lưu ý là nếu --ingroup không được đặt thì GID được chỉ định để khớp với UID. Nếu GID tương ứng với UID được cung cấp đã tồn tại thì trình bổ sung sẽ bị lỗi.

thêm nhóm

BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.

Usage: addgroup [-g GID] [-S] [USER] GROUP

Add a group or add a user to a group

        --gid GID  Group id
        --system   Create a system group

Tôi đã phát hiện ra tất cả những điều này trong khi cố gắng viết phương án thay thế của riêng mình cho dự án fixuid để chạy vùng chứa dưới dạng UID / GID của máy chủ.

Tập lệnh trình trợ giúp entrypoint của tôi có thể được tìm thấy trên GitHub.

Mục đích là thêm tập lệnh đó làm đối số đầu tiên ENTRYPOINTkhiến Docker suy ra UID và GID từ một liên kết ràng buộc có liên quan.

Một biến môi trường "TEMPLATE" có thể được yêu cầu để xác định các quyền sẽ được suy ra từ đâu.

(Tại thời điểm viết, tôi không có tài liệu cho tập lệnh của mình. Nó vẫn nằm trong danh sách việc cần làm !!)


11
+1, sử dụng biểu mẫu dài cho các chuỗi lệnh giúp tăng khả năng đọc và giúp bảo trì dễ dàng hơn. Khi viết kịch bản shell luôn luôn sử dụng các hình thức dài (Dockerfile RUN không có gì khác hơn là một kịch bản shell).
Victor Schröder
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.