web-dev-qa-db-ja.com

Dockerコンテナにユーザーを追加する

私は内部で実行されているいくつかのプロセス(uwsgiとcelery)を含むdockerコンテナーを持っています。パーミッションを割り当てるために、これらのプロセス用のceleryユーザーとuwsgiユーザー、およびそれらが属するワーカーグループを作成します。

DockerfileにRUN adduser uwsgiRUN adduser celeryを追加しようとしましたが、これらのコマンドが入力を促すため、問題が発生しています(以下のビルドからの応答を投稿しました)。

コンテナで実行されているワーカーに権限を設定するために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] 
196
rfj001

そのトリックは、対話型のラッパーuseraddの代わりにadduserを使うことです。私は通常ユーザーを作成します。

RUN useradd -ms /bin/bash newuser

これはユーザーのホームディレクトリを作成し、bashがデフォルトのシェルであることを確認します。

その後追加することができます:

USER newuser
WORKDIR /home/newuser

あなたのdockerfileに。その後のすべてのコマンドと対話型セッションは、ユーザーnewuserとして実行されます。

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

ユーザーコマンドを呼び出す前に、実行する予定のプログラムを実行する権限をnewuserに付与する必要があるかもしれません。

セキュリティ上の理由から、コンテナ内で特権のないユーザを使用することをお勧めします。また、いくつかの欠点もあります。最も重要なことに、あなたのイメージからイメージを派生させる人々はスーパーユーザー特権でコマンドを実行することができる前にrootに戻る必要があります。

345
Paul Staab

Adduserによる対話式の質問を避けるために、これらのパラメータでそれを呼び出すことができます。

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

--gecosパラメータは追加情報を設定するために使用されます。この場合それはただ空です。

Busyboxがあるシステムでは(Alpineのように)、

RUN adduser -D -g '' newuser

busybox adduser を参照してください。

73
Raffael

ウブンツ

Dockerfileに次の行を試してください。

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G Sudo -u 1000 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)"を追加します。

31
kenorb

セキュリティの観点から、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プロジェクトファイルのコピー、ユーザーグループとユーザーの作成、プロジェクトフォルダに対するアクセス許可の割り当て、新しく作成されたユーザーへの切り替え、およびそのユーザーの下でのアプリケーションの実行の完全な例です。

3
S.Mishra

この行をあなたのDockerfileに追加してください(この方法で任意のlinuxコマンドを実行できます)

RUN useradd -ms /bin/bash yourNewUserName
1
Karl Morrison

たとえば、オープンソースの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

オープンソースをフォローする良い方法だと思います。

1
Ryan Miao

誰もが個人的なお気に入りがあり、これは私のものです:

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による回答

0
Acumenus