Docker 컨테이너에 사용자를 추가하는 방법은 무엇입니까?


285

내부에서 일부 프로세스 (uwsgi 및 셀러리)가 실행되는 도커 컨테이너가 있습니다. 권한을 할당하기 위해 이러한 프로세스에 대해 셀러리 사용자와 uwsgi 사용자 및 둘 다 속한 작업자 그룹을 만들고 싶습니다.

나는 추가를 시도 RUN adduser uwsgi하고RUN adduser celeryDockerfile을 문제가 발생했습니다.이 명령은 입력을 요구하기 때문에 (아래 빌드에서 응답을 게시했습니다).

컨테이너에서 실행되는 작업자의 권한을 설정하기 위해 Docker 컨테이너에 사용자를 추가하는 가장 좋은 방법은 무엇입니까?

내 Docker 이미지는 공식 Ubuntu14.04 기반으로 작성되었습니다.

adduser 명령이 실행될 때 Dockerfile의 출력은 다음과 같습니다.

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] 

답변:


489

트릭은 useradd대화식 래퍼 대신 사용하는 것입니다 adduser. 나는 보통 다음을 사용하여 사용자를 만듭니다.

RUN useradd -ms /bin/bash newuser

이는 사용자의 홈 디렉토리를 작성하고 bash가 기본 쉘인지 확인합니다.

그런 다음 다음을 추가 할 수 있습니다.

USER newuser
WORKDIR /home/newuser

도커 파일에. 이후의 모든 명령과 대화식 세션은 사용자로 실행됩니다 newuser.

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

newuser사용자 명령을 호출하기 전에 실행하려는 프로그램을 실행할 수 있는 권한 을 부여해야 할 수도 있습니다 .

컨테이너 내에서 권한이없는 사용자를 사용하는 것이 보안상의 이유로 좋은 생각입니다. 또한 몇 가지 단점이 있습니다. 가장 중요한 것은 이미지에서 이미지를 추출하는 사람들이 수퍼 유저 권한으로 명령을 실행하려면 먼저 루트로 전환해야합니다.


142
짧은 이름 대신 스크립트와 같이 Dockerfile에서 전체 이름 옵션을 사용하는 것이 좋습니다 (대화식으로 IMO를 사용할 때 더 많이 사용됨). useradd --create-home --shell /bin/bash동료가 더 이해하기 쉽고 읽을 수 있습니다.
Baptiste Mathus

25
비밀번호를 설정하기 위해 다음과 같이 chpasswd를 사용할 수 있습니다.RUN echo 'newuser:newpassword' | chpasswd
iuridiniz

3
사용자 ID가 큰 새 사용자를 만드는 경우 docker가 lastlog ( 대량의 스파 스 파일) 를 만들려고 할 때 중단 / 충돌 될 수 있습니다. --no-log-init옵션으로 이것을 피하십시오 useradd.
davidA

10
좋은 팁, @iuridiniz! 전에 전화하는 것을 잊지 마십시오 USER newuser. 사용자에게 루트 권한이 필요한 경우을 포함 할 수도 있습니다 adduser <username> sudo.
Yamaneko

6
/bin/sh: useradd: not found알파인 리눅스
deathangel908

91

adduser의 대화식 질문을 피하기 위해 다음 매개 변수를 사용하여 질문 할 수 있습니다.

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

--gecos매개 변수는 추가 정보를 설정하는 데 사용됩니다. 이 경우에는 비어 있습니다.

busybox (Alpine과 같은)가있는 시스템에서는

RUN adduser -D -g '' newuser

busybox adduser 참조


3
감사! 그것은 보이는 adduser고레벨 용액은 일반적으로 같은 낮은 수준의 기능을 사용하는 것이 바람직하다 useradd.
akhmed

adduser: unrecognized option: gecos알파인에서는 작동하지 않는 것 같습니다.
weberc2

--disabled-password는 무엇을하고 Dockerfile에서 사용자에게 암호를 동시에 설정할 수 있습니까?
Hossein

72

우분투

다음 줄을 사용해보십시오 Dockerfile:

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

useradd옵션 (: 참조 man useradd) :

  • -r, --system시스템 계정을 만듭니다. 참조 : 의미 생성 시스템 계정을
  • -m, --create-home사용자의 홈 디렉토리를 작성하십시오.
  • -d, --home-dir HOME_DIR새 계정의 홈 디렉토리.
  • -s, --shell SHELL새 계정의 로그인 쉘.
  • -g, --gid GROUP기본 그룹의 이름 또는 ID입니다.
  • -G, --groups GROUPS보충 그룹 목록.
  • -u, --uid UID사용자 ID를 지정하십시오. 참조 : Docker 컨테이너에서 uid 및 gid 작동 방식 이해
  • -p, --password PASSWORD새 계정의 암호화 된 비밀번호 (예 :) ubuntu.

기본 사용자 비밀번호 설정

사용자 암호를 설정하려면 추가 -p "$(openssl passwd -1 ubuntu)"useradd명령을 실행합니다.

또는 다음 줄을 추가하십시오 Dockerfile.

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

첫 번째 셸 명령 은 파이프를 -o pipefail사용하기 전에 옵션이 활성화되어 있는지 확인하는 RUN것입니다. 더 읽기 : Hadolint : Dockerfile Linting .


2
사용자가 루트 그룹에있는 이유는 무엇입니까? 이것의 핵심은 보안을 위해 루트가 아닌 사용자를
갖는 것입니다

5
@Novaterata 사용에 따라 다릅니다. root그룹은 루트 액세스 권한을 나타내지 않고 일부 파일 (예 : 로그)에 대한 읽기 권한이 많으므로 유용하지만 프로젝트에 따라 다릅니다.
kenorb

이것이 작동하는 것을 볼 수 있으며 자동으로 사용자로 로그인했지만 루트가 소유 한 파일을 생성하고 있습니다. 로컬 사용자 및 그룹의 사용자 이름이 'user'이므로 방금 'USER user'를 사용했습니다. 여전히 루트 소유 파일을 생성합니다. 내가해야 할 다른 일이 있습니까? 기본적으로 코드베이스를 컴파일하는 도커 컨테이너를 만들고 있습니다. 따라서 svn에서 코드를 체크 아웃하고 bash 소스를 사용하여 변수를 설정합니다. 루트 암호를 요청하지 않아도 bash 명령이 루트로 작업을 수행 할 수 있습니까?
JoeManiaci

14

docker에서 사용자를 추가하고 해당 사용자로 앱을 실행하는 것은 보안 관점에서 매우 좋습니다. 그렇게하려면 아래 단계를 권장합니다.

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"]

위의 단계는 NodeJS 프로젝트 파일 복사, 사용자 그룹 및 사용자 작성, 프로젝트 폴더의 사용자에게 권한 지정, 새로 작성된 사용자로 전환하고 해당 사용자에서 앱을 실행하는 전체 예제입니다.


1
addgroup이 실패했습니다. 11/15 단계 : RUN addgroup -S username ---> db9fd22d469d에서 실행 옵션 s가 모호합니다 (쉘, 시스템) adduser [--home DIR] [--shell SHELL] [--no-create -home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [-그룹 내 그룹 | --gid ID는] [--disabled - 비밀번호] [--disabled-로그인] [--encrypt 가정] 사용자는 일반 사용자 추가
teoring

9

다음과 같이 오픈 소스 Dockerfile을 모방 할 수 있습니다.

노드 : node12-github

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

수퍼 셋 : superset-github

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

오픈 소스를 따르는 것이 좋은 방법이라고 생각합니다.


3

모두가 개인적으로 좋아하는 것은 내 것입니다.

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

참조 : man useradd

RUN줄은 사용자와 그룹을 추가합니다 app:

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

app이미지를 기본 이미지로 재사용 할 때보 다 더 구체적인 이름을 사용하십시오 . 따로, --shell /bin/bash정말로 필요한 경우 포함 하십시오.


부분 신용 : Ryan M의 답변


1

또는 이렇게 할 수 있습니다.

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

첫 번째 명령은 demo 라는 그룹을 만듭니다 . 두 번째 명령은 데모 사용자를 만들어 이전에 만든 데모 그룹에 추가합니다 .

깃발의 약자 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.