私は内部で実行されているいくつかのプロセス(uwsgiとcelery)を含むdockerコンテナーを持っています。パーミッションを割り当てるために、これらのプロセス用のceleryユーザーとuwsgiユーザー、およびそれらが属するワーカーグループを作成します。
DockerfileにRUN adduser uwsgi
とRUN 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]
そのトリックは、対話型のラッパー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に戻る必要があります。
Adduserによる対話式の質問を避けるために、これらのパラメータでそれを呼び出すことができます。
RUN adduser --disabled-password --gecos '' newuser
--gecos
パラメータは追加情報を設定するために使用されます。この場合それはただ空です。
Busyboxがあるシステムでは(Alpineのように)、
RUN adduser -D -g '' newuser
busybox adduser を参照してください。
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)"
を追加します。
セキュリティの観点から、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に追加してください(この方法で任意のlinuxコマンドを実行できます)
RUN useradd -ms /bin/bash yourNewUserName
たとえば、オープンソースの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による回答