非 root ユーザーで Docker 内のアプリを実行する
質問
この後
昨日のショッカーのニュース
のニュースを見て、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
.
関連
-
[解決済み】ExpressJSとMeteorJSの比較【終了しました
-
[解決済み】ENOENT, そのようなファイルまたはディレクトリがありません。
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] NodeJsのSequelizeでautoIncrementはどのように動作するのですか?
-
[解決済み] Express.js req.bodyが未定義です。
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] 既に起動しているDockerコンテナに新しいTTYで入る方法
-
[解決済み] Dockerコンテナの実行と起動の違いについて
-
[解決済み】Dockerコンテナ内のRootパスワードについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「安全なTLS接続が確立される前にクライアントのネットワークソケットが切断されました」(ノード10
-
[解決済み] 非推奨パッケージに関するNPM警告メッセージ
-
[解決済み】MongoDBでコレクションを日付で並べ替えるには?
-
[解決済み】MongooseでEnumを作成し使用する方法
-
webpack ENOENTソリューションの起動
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] ノードマータ予期せぬフィールド
-
[解決済み] Express.js req.bodyが未定義です。