特別な方法で指定しない限り、コンテナ内のすべてのプロセスは root ユーザーとして実行されます。 このユーザーには制限がないので、これは非常に便利だと思われます。 これが、セキュリティの観点から root として作業することが間違っている理由です。 root 権限でローカル コンピュータ上で作業する正気の人間がいない場合、多くの人がコンテナ内の root でプロセスを実行します。
マルウェアがコンテナから逃れてホスト コンピュータに侵入することを可能にするバグが常に存在します。 最悪の事態を想定して、コンテナ内のプロセスがホスト マシン上で権限を持たないユーザーによって実行されるようにする必要があります。
ユーザーの作成
コンテナーでのユーザーの作成は、Linux ディストリビューションでのユーザーの作成と何ら変わりません。 ただし、コマンドは基本イメージごとに異なる場合があります。
Debian ベースのディストリビューションの場合、以下を Dockerfile に追加する必要があります。
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
アルパインの場合:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
ユーザーからのプロセスの実行
後続のすべてのプロセスを UID 2000 のユーザーとして実行するには、次のコマンドを実行します。
USER 2000
後続のすべてのプロセスをノード ユーザーとして実行するには、次のコマンドを実行します。
USER node
でより多くの
ボリュームのマウント
コンテナ内にボリュームをマウントする場合は、ユーザーにファイルの読み取りおよび/または書き込みの機能を提供します。 これを行うには、コンテナ内のユーザーの UID (GID) と、ファイルにアクセスする適切な権限を持つコンテナ外のユーザーの UID (GID) が一致する必要があります。 この場合、ユーザー名は関係ありません。
Linux コンピューターでは、ユーザーの UID と GID は 1000 に等しいことがよくあります。これらの識別子は、コンピューターの最初のユーザーに割り当てられます。
識別子を見つけるのは簡単です。
id
ユーザーに関する包括的な情報を受け取ります。
例の 2000 を実際の識別子に置き換えれば、すべて問題なく動作します。
ユーザーへの UID と GID の割り当て
ユーザーが以前に作成されているが、識別子を変更する必要がある場合は、次のように行うことができます。
RUN usermod -u 1000 node
&& groupmod -g 1000 node
アルパインベースイメージを使用している場合は、シャドウパッケージをインストールする必要があります。
RUN apk add —no-cache shadow
イメージのビルド時にコンテナ内でユーザー ID を渡す
自分の ID とプロジェクトで作業するすべての人の ID が一致する場合は、この ID を Dockerfile に指定するだけです。 ただし、多くの場合、ユーザー ID は一致しません。
望むことを達成する方法はすぐにはわかりません。 私にとって、これは Docker をマスターする過程で最も困難なことでした。 多くの Docker ユーザーは、イメージの存続期間にさまざまな段階があることに気づいていません。 まず、Dockerfile を使用してイメージをアセンブルします。 イメージからコンテナーを実行する場合、Dockerfile は使用されなくなりました。
ユーザーの作成は、イメージの構築時に行う必要があります。 プロセスを起動するユーザーの決定にも同じことが当てはまります。 これは、何らかの方法でコンテナ内で UID (GID) を渡す必要があることを意味します。
ディレクティブは、Dockerfile で外部変数を使用するために使用されます。
ドッカーファイル
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
次のように docker-compose 経由で引数を渡すことができます。
ドッカーの作成
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS Docker の複雑さをすべてマスターするには、ドキュメントや記事を読むだけでは十分ではありません。 たくさん練習して、Docker の感覚をつかむ必要があります。
出所: habr.com