1. ホーム
  2. node.js

非 root ユーザーで Docker 内のアプリを実行する

2023-07-24 17:46:57

質問

この後 昨日のショッカーのニュース のニュースを見て、Dockerコンテナ内のアプリはrootで実行してはいけないような気がしてきました。 試しに自分の Dockerfile を更新してアプリユーザーを作成しようとしましたが、アプリファイルのパーミッションを(root のまま)変更してもうまくいかないようです。 これは、LXC 権限が root ユーザーに付与されていないことが原因だと推測しています。

以下は私の Dockerfile です。

# Node.js app Docker file

FROM dockerfile/nodejs
MAINTAINER Thom Nichols "[email protected]"

RUN useradd -ms /bin/bash node

ADD . /data
# This next line doesn't seem to have any effect:
RUN chown -R node /data 

ENV HOME /home/node
USER node

RUN cd /data && npm install

EXPOSE 8888

WORKDIR /data

CMD ["npm", "start"]

かなりわかりやすいですが、私が ls -l を実行しても、すべてrootが所有します。

[ node@ed7ae33e76e1:/data {docker-nonroot-user} ]$ ls -l /data
total 64K
-rw-r--r--  1 root root  383 Jun 18 20:32 Dockerfile
-rw-r--r--  1 root root  862 Jun 18 16:23 Gruntfile.js
-rw-r--r--  1 root root 1.2K Jun 18 15:48 README.md
drwxr-xr-x  4 root root 4.0K May 30 14:24 assets/
-rw-r--r--  1 root root  416 Jun  3 14:22 bower.json
-rw-r--r--  1 root root  930 May 30 01:50 config.js
drwxr-xr-x  4 root root 4.0K Jun 18 16:08 lib/
drwxr-xr-x 42 root root 4.0K Jun 18 16:04 node_modules/
-rw-r--r--  1 root root 2.0K Jun 18 16:04 package.json
-rw-r--r--  1 root root  118 May 30 18:35 server.js
drwxr-xr-x  3 root root 4.0K May 30 02:17 static/
drwxr-xr-x  3 root root 4.0K Jun 18 20:13 test/
drwxr-xr-x  3 root root 4.0K Jun  3 17:38 views/


更新したdockerfileがうまく動きました ボリュームがどのように機能するかについての @creak の説明に感謝します。 いったん初期ファイルが chown を編集します。 npm install は非 root ユーザで実行されます。 そして postinstall フックのおかげで、npm は bower install && grunt assets を実行することで、残りのインストールステップを行い npm install -g のようなノードクライツールは必要ありません。

どのように解決するのですか?

これはちょっと厄介で、実はスタート地点の画像が原因です。

もし、あなたが を見ると、ソース を見ると、以下のことに気づきます。 /data/ がボリュームであることがわかります。ですから、あなたが Dockerfile で行ったことはすべて破棄され、その後にマウントされるボリュームによって実行時に上書きされます。

CMD を次のようなものに変更することで、実行時に chown することができます。 CMD chown -R node /data && npm start .