ฉันจะเพิ่มผู้ใช้ได้อย่างไรเมื่อฉันใช้ Alpine เป็นภาพพื้นฐาน


118

ฉันใช้alpine(หรือรูปภาพที่อิงจาก Alpine) เป็นรูปภาพพื้นฐานใน Dockerfile ฉันต้องเพิ่มคำแนะนำใดเพื่อสร้างผู้ใช้

ในที่สุดฉันจะใช้ผู้ใช้รายนี้เพื่อเรียกใช้แอปพลิเคชันที่ฉันจะวางลงในคอนเทนเนอร์เพื่อไม่ให้ผู้ใช้รูท

คำตอบ:


235

Alpine ใช้คำสั่งadduserและaddgroupสำหรับการสร้างผู้ใช้และกลุ่ม (แทนที่จะเป็นuseraddและusergroup)

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

แฟล็กสำหรับadduserคือ:

การใช้งาน: adduser [OPTIONS] USER [GROUP]

สร้างผู้ใช้ใหม่หรือเพิ่ม USER ใน GROUP

        -h DIR โฮมไดเร็กทอรี
        -g ฟิลด์ GECOS GECOS
        -s เชลล์เข้าสู่ระบบเชลล์
        -G GRP กลุ่ม
        -S สร้างผู้ใช้ระบบ
        -D อย่ากำหนดรหัสผ่าน
        -H อย่าสร้างโฮมไดเร็กทอรี
        -u UID รหัสผู้ใช้
        -k ไดเรกทอรีโครงกระดูก SKEL (/ etc / skel)

เพิ่มเอกสารทางการของผู้ใช้ใหม่


7
หรือคุณสามารถแทนที่ข้อมูลโค้ดด้านบนทั้งหมดได้โดยใช้สิ่งนี้USER 405ซึ่งเป็นผู้ใช้ทั่วไปภายใน Alpine Linux
Daniel Gartmann

8
ทำไมไม่USER guest?
user672009

3
ฉันจะไปกับการสร้างผู้ใช้ใหม่เพราะฉันต้องการให้ผู้ใช้นั้นมี UID / GID เดียวกันกับที่อยู่บนโฮสต์ OS เพื่อไม่ให้มีปัญหาเรื่องสิทธิ์เมื่อเรียกใช้นักเทียบท่าใน Linux (ไม่ใช่ปัญหากับผู้ใช้ macOS / Windows)
elquimista

5
หมายเหตุว่าตั้งแต่อัลไพน์จะขึ้นอยู่กับ BusyBox มันadduserและaddgroupคำสั่งที่มีความแตกต่างจากadduserและaddgroupให้เป็นไปตาม Debian และ Ubuntu ซึ่งจะเป็นปลายด้านหน้าและuseradd groupaddโดยเฉพาะอย่างยิ่งคำสั่ง Debian และ Ubuntu รองรับตัวเลือกแบบยาวเท่านั้น ดู: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack

ฉันสร้างคอนเทนเนอร์นักเทียบท่าแล้วตอนนี้ฉันต้องเรียกใช้คำสั่งใดเพื่อเพิ่มผู้ใช้
Aashish Kumar

75

คำสั่งคือadduserและaddgroup.

นี่คือเทมเพลตสำหรับ Docker ที่คุณสามารถใช้ได้ในสภาพแวดล้อม busybox (อัลไพน์) รวมถึงสภาพแวดล้อมที่ใช้ Debian (Ubuntu ฯลฯ ):

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

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

สังเกตสิ่งต่อไปนี้:

  • --disabled-password ป้องกันไม่ให้แจ้งรหัสผ่าน
  • --gecos "" หลีกเลี่ยงการแจ้ง "ชื่อเต็ม" ฯลฯ บนระบบที่ใช้ Debian
  • --home "$(pwd)"ตั้งค่าบ้านของผู้ใช้เป็น WORKDIR คุณอาจไม่ต้องการสิ่งนี้
  • --no-create-home ป้องกันการคัดลอก cruft ไปยังไดเร็กทอรีจาก /etc/skel

คำอธิบายการใช้งานสำหรับแอ็พพลิเคชันเหล่านี้ไม่มีแฟล็กแบบยาวที่มีอยู่ในโค้ดสำหรับadduserและaddgroup addgroup

แฟล็กแบบยาวต่อไปนี้ควรใช้ได้ทั้งในอัลไพน์และเดเบียน - อนุพันธ์:

adduser

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

สิ่งหนึ่งที่ควรทราบก็คือถ้า --ingroupไม่ได้ตั้งค่า GID จะถูกกำหนดให้ตรงกับ UID หาก GID ที่ตรงกับ UID ที่ระบุมีอยู่แล้ว adduser จะล้มเหลว

addgroup

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

ฉันค้นพบทั้งหมดนี้ในขณะที่พยายามเขียนทางเลือกของตัวเองให้กับโครงการfixuidสำหรับการเรียกใช้คอนเทนเนอร์เป็นโฮสต์ UID / GID

สคริปต์ตัวช่วยจุดเริ่มต้นของฉันสามารถพบได้ใน GitHub

จุดประสงค์คือเพื่อนำหน้าสคริปต์นั้นเป็นอาร์กิวเมนต์แรกENTRYPOINTที่ควรทำให้ Docker อนุมาน UID และ GID จากการเชื่อมโยงที่เกี่ยวข้อง

อาจต้องใช้ตัวแปรสภาพแวดล้อม "TEMPLATE" เพื่อกำหนดว่าควรจะอนุมานสิทธิ์จากที่ใด

(ตอนที่เขียนฉันไม่มีเอกสารสำหรับสคริปต์ของฉันมันยังอยู่ในรายการสิ่งที่ต้องทำ !!)


13
+1 โดยใช้รูปแบบยาวสำหรับ args คำสั่งช่วยเพิ่มความสามารถในการอ่านและทำให้การบำรุงรักษาง่ายขึ้น เมื่อเขียนสคริปต์เปลือกมักจะใช้รูปแบบยาว (Dockerfile RUN คือไม่มีอะไรอื่นนอกจากสคริปต์เปลือก)
Victor Schröder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.