Docker kapsayıcısına kullanıcılar nasıl eklenir?


286

İçinde çalışan bazı işlemler (uwsgi ve kereviz) ile bir liman işçisi konteynır var. Bu işlemler için bir kereviz kullanıcısı ve bir uwsgi kullanıcısı ve izin atamak için her ikisinin de ait olacağı bir işçi grubu oluşturmak istiyorum.

Ben RUN adduser uwsgive RUN adduser celeryDockerfile eklemeyi denedim , ama bu komutlar giriş istemi beri bu sorunlara neden oluyor (Ben aşağıdaki derleme yanıtları yayınladım).

Kapta çalışan işçiler için izinler ayarlamak üzere Docker kapsayıcısına kullanıcı eklemenin en iyi yolu nedir?

Docker'ım resmi resmi Ubuntu14.04 tabanından oluşturuldu.

Adduser komutları çalıştırıldığında Dockerfile'dan çıktı:

Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ... 
Adding new user `uwsgi' (1000) with group `uwsgi' ... 
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
    Full Name []: 
Room Number []:     Work Phone []:  Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 
---> 258f2f2f13df 
Removing intermediate container 59948863162a 
Step 5 : RUN adduser celery 
---> Running in be06f1e20f64 
Adding user `celery' ...
Adding new group `celery' (1001) ... 
Adding new user `celery' (1001) with group `celery' ... 
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for celery
Enter the new value, or press ENTER for the default
    Full Name []:   Room Number []:     Work Phone []: 
Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 

Yanıtlar:


489

İşin püf noktası useradd, etkileşimli ambalajı yerine kullanmaktır adduser. Genellikle aşağıdakilerle kullanıcılar oluştururum:

RUN useradd -ms /bin/bash newuser

kullanıcı için bir giriş dizini oluşturur ve bash'ın varsayılan kabuk olmasını sağlar.

Daha sonra şunları ekleyebilirsiniz:

USER newuser
WORKDIR /home/newuser

dockerfile. Daha sonraki her komut ve etkileşimli oturumlar kullanıcı olarak yürütülür newuser:

docker run -t -i image
newuser@131b7ad86360:~$

newuserKullanıcı komutunu çağırmadan önce çalıştırmak istediğiniz programları yürütmek için izin vermeniz gerekebilir .

Ayrıcalıklı olmayan kullanıcıları kapsayıcıların içinde kullanmak güvenlik nedeniyle iyi bir fikirdir. Ayrıca birkaç dezavantajı var. En önemlisi, görüntünüzden görüntü alan kişilerin, süper kullanıcı ayrıcalıklarına sahip komutları yürütebilmeleri için kök haline dönmeleri gerekir.


142
Bir dockerfile tam ad seçenekleri, bir komut dosyası gibi, kısa olanlar yerine (daha etkileşimli IMO kullanıldığında kullanılacak) kullanmanızı öneririz. useradd --create-home --shell /bin/bashiş arkadaşları için daha anlaşılır / okunabilir.
Baptiste Mathus

25
Şifre ayarlamak için chpasswd gibi kullanabilirsiniz:RUN echo 'newuser:newpassword' | chpasswd
iuridiniz

3
Büyük bir kullanıcı kimliğine sahip yeni bir kullanıcı oluşturuyorsanız, docker, büyük bir seyrek dosya olan lastlog'u oluşturmaya çalışırken kilitlenebilir / kilitlenebilir . Bu kaçının --no-log-initseçeneği useradd.
davidA

10
Güzel ipucu, @iuridiniz! Daha önce aramayı unutmayın USER newuser. Ayrıca kullanıcının root ayrıcalıklarına sahip olması gerekiyorsa, bunu da dahil edebilirsiniz adduser <username> sudo.
Yamaneko

6
/bin/sh: useradd: not foundalp linux
deathangel908

92

Adduser ile etkileşimli soruları önlemek için, sorguyu şu parametrelerle arayabilirsiniz:

RUN adduser --disabled-password --gecos '' newuser

--gecosParametre ek bilgileri ayarlamak için kullanılır. Bu durumda sadece boş.

Meşgul kutulu sistemlerde (Alpine gibi),

RUN adduser -D -g '' newuser

Meşgul kutusu ekleyicisine bakın


3
Teşekkürler! Görünüşe göre, adduserüst düzey çözüm genellikle düşük düzey işlevlerin kullanılması için tercih edilir useradd.
Ahmed

adduser: unrecognized option: gecosBu Alpine'de işe yaramıyor gibi görünüyor.
weberc2

--disabled-password ne yapar ve Dockerfile'da kullanıcıya aynı anda nasıl şifre ayarlayabiliriz?
Hossein

72

Ubuntu

Aşağıdaki satırları deneyin Dockerfile:

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useraddseçenekleri (bakınız:) man useradd:

Varsayılan kullanıcının şifresini ayarlama

Kullanıcı parolasını ayarlamak -p "$(openssl passwd -1 ubuntu)"için useraddkomuta ekleyin .

Alternatif olarak şu satırları da ekleyin Dockerfile:

SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd

İlk kabuk talimatı , -o pipefailseçeneğin RUNiçinde bir boru ile etkinleştirildiğinden emin olmaktır . Daha fazla bilgi için: Hadolint: Dockerfile'ınızı dizme .


2
Kullanıcı neden kök grupta olsun ki? Bunun asıl amacı güvenlik amaçlı root olmayan bir kullanıcıya sahip olmak değil
Novaterata

5
@Novaterata Kullanıma bağlı olarak. rootgrup kök erişime sahip olduklarını göstermez, sadece bazı dosyalara (günlükler gibi) daha fazla okuma erişimi vardır, bu da yararlıdır, ancak projeye bağlıdır.
kenorb

Bunun işe yaradığını görebiliyorum, otomatik olarak kullanıcı olarak oturum açtım, ancak hala root'a ait dosyalar üretiyorum. Hatta yerel kullanıcı ve gruptaki kullanıcı adım 'kullanıcı' olduğundan 'USER kullanıcısı' kullandım. Hala kök sahip dosyalar oluşturur. Yapmam gereken başka bir şey var mı? Temelde bizim kod tabanı derleyen bir docker konteyner yapıyorum. Bu yüzden svn'den kodu kontrol eder, bash kaynağını kullanarak değişkenleri ayarlar. Bash komutları, root şifresini hiç istemesem bile kök olarak işler yapabilir mi?
JoeManiaci

14

Docker'a kullanıcı eklemek ve uygulamanızı bu kullanıcı altında çalıştırmak güvenlik açısından çok iyi bir uygulamadır. Bunu yapmak için aşağıdaki adımları tavsiye ederim:

FROM node:10-alpine

# Copy source to container
RUN mkdir -p /usr/app/src

# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production    

# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup

# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app

# Switch to 'appuser'
USER appuser

# Open the mapped port
EXPOSE 3000

# Start the process
CMD ["npm", "start"]

Yukarıdaki adımlar, NodeJS proje dosyalarının kopyalanması, bir kullanıcı grubu ve kullanıcı oluşturulması, proje klasörü için kullanıcıya izinler atanması, yeni oluşturulan kullanıcıya geçilmesi ve uygulamanın o kullanıcı altında çalıştırılması için tam bir örnektir.


1
addgroup benim için başarısız oldu, Adım 11/15: RUN addgroup -S kullanıcı adı ---> db9fd22d469d'de çalışıyor Seçenek s belirsiz (kabuk, sistem) adduser [--home DIR] [--shell SHELL] [--no-create -ev] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [- grup GRUBU | --gid ID] [--disabled-password] [--disabled-login] [--encrypt-home] KULLANICI Normal bir kullanıcı ekle
teoring

9

Açık kaynak Dockerfile'ı taklit edebilirsiniz, örneğin:

Düğüm: node12-github

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

süper set: süper set-github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset

Bence açık kaynağı takip etmenin iyi bir yolu.


3

Herkesin kişisel favorisi var ve bu benim:

RUN useradd --user-group --system --create-home --no-log-init app
USER app

Referans: man useradd

RUNHat kullanıcı ve grup katacak app:

root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)

appGörüntünün temel görüntü olarak yeniden kullanılmasından daha belirgin bir ad kullanın . Bir kenara, --shell /bin/bashgerçekten ihtiyacınız varsa ekleyin .


Kısmi kredi: Ryan M tarafından cevap


1

Alternatif olarak bunu yapabilirsiniz.

RUN addgroup demo && adduser -DH -G demo demo

İlk komut demo adında bir grup oluşturur . İkinci komut oluşturur demo kullanıcısı ve onu daha önce oluşturulmuş demo grubuna ekler .

Flags ne anlama geliyor:

-G Group
-D Don't assign password
-H Don't create home directory

0

Bu satırı Dockerfile'ınıza ekleyin (Herhangi bir linux komutunu bu şekilde çalıştırabilirsiniz)

RUN useradd -ms /bin/bash yourNewUserName
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.