내부에서 일부 프로세스 (uwsgi 및 셀러리)가 실행되는 도커 컨테이너가 있습니다. 권한을 할당하기 위해 이러한 프로세스에 대해 셀러리 사용자와 uwsgi 사용자 및 둘 다 속한 작업자 그룹을 만들고 싶습니다.
나는 추가를 시도 RUN adduser uwsgi
하고RUN adduser celery
Dockerfile을 문제가 발생했습니다.이 명령은 입력을 요구하기 때문에 (아래 빌드에서 응답을 게시했습니다).
컨테이너에서 실행되는 작업자의 권한을 설정하기 위해 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]
답변
트릭은 useradd
대화식 래퍼 대신 사용하는 것입니다 adduser
. 나는 보통 다음을 사용하여 사용자를 만듭니다.
RUN useradd -ms /bin/bash newuser
이는 사용자의 홈 디렉토리를 작성하고 bash가 기본 쉘인지 확인합니다.
그런 다음 다음을 추가 할 수 있습니다.
USER newuser
WORKDIR /home/newuser
도커 파일에. 이후의 모든 명령과 대화식 세션은 사용자로 실행됩니다 newuser
.
docker run -t -i image
newuser@131b7ad86360:~$
newuser
사용자 명령을 호출하기 전에 실행하려는 프로그램을 실행할 수 있는 권한 을 부여해야 할 수도 있습니다 .
컨테이너 내에서 권한이없는 사용자를 사용하는 것이 보안상의 이유로 좋은 생각입니다. 또한 몇 가지 단점이 있습니다. 가장 중요한 것은 이미지에서 이미지를 추출하는 사람들이 수퍼 유저 권한으로 명령을 실행하려면 먼저 루트로 전환해야합니다.
답변
adduser의 대화식 질문을 피하기 위해 다음 매개 변수를 사용하여 질문 할 수 있습니다.
RUN adduser --disabled-password --gecos '' newuser
이 --gecos
매개 변수는 추가 정보를 설정하는 데 사용됩니다. 이 경우에는 비어 있습니다.
busybox (Alpine과 같은)가있는 시스템에서는
RUN adduser -D -g '' newuser
답변
우분투
다음 줄을 사용해보십시오 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 .
답변
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 프로젝트 파일 복사, 사용자 그룹 및 사용자 작성, 프로젝트 폴더의 사용자에게 권한 지정, 새로 작성된 사용자로 전환하고 해당 사용자에서 앱을 실행하는 전체 예제입니다.
답변
다음과 같이 오픈 소스 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
오픈 소스를 따르는 것이 좋은 방법이라고 생각합니다.
답변
모두가 개인적으로 좋아하는 것은 내 것입니다.
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의 답변
답변
또는 이렇게 할 수 있습니다.
RUN addgroup demo && adduser -DH -G demo demo
첫 번째 명령은 demo 라는 그룹을 만듭니다 . 두 번째 명령은 데모 사용자를 만들어 이전에 만든 데모 그룹에 추가합니다 .
깃발의 약자 :
-G Group
-D Don't assign password
-H Don't create home directory