私はdocker hub link hereビルDockerfile - 中間容器間保持ファイル
keymetricsの公式画像を使用して、非常に基本的なコンテナを構築していますが、これはそれが非常にドッカーの質問ですNode.jsのかPM2問題ではない、特にdocker build
Dockerfileのステップ(npm install
)は、ノードパッケージをnode_modulesフォルダ(IT WORKS)にプルダウンします。フォルダが作成され、ファイルがダウンロードされ、ビルド出力に表示されます(下記参照)。
問題は、そのRUNコマンドが完了すると、中間コンテナが削除され、node_modulesフォルダが失われることです。
私のドッカーファイルには、ファイルに何が起こっているのかを明確にするために、いくつかのls -l
コマンドがあります。
FROM keymetrics/pm2:latest
# Bundle APP files
COPY src src/
COPY package.json .
COPY pm2.json .
# Install app dependencies
ENV NPM_CONFIG_LOGLEVEL info
RUN pwd && ls -l /app && npm install && ls -l
# Show current folder structure in logs
RUN ls -l
CMD [ "pm2-docker", "start", "pm2.json" ]
ビルド:
作業ディレクトリ(/app
)に保持されているファイルのみ
私Dockerfileであるとのホストからコピーされたファイルですコマンド: docker build -t localapps/pm2_test_app:0.0.4 .
ビルド出力
Sending build context to Docker daemon 13.31kB
Step 1/8 : FROM keymetrics/pm2:latest
---> 6aa333f957ec
Step 2/8 : COPY src src/
---> Using cache
---> 6b73b4463af5
Step 3/8 : COPY package.json .
---> Using cache
---> d27a2e75fdde
Step 4/8 : COPY pm2.json .
---> Using cache
---> 9864d9dd73a9
Step 5/8 : ENV NPM_CONFIG_LOGLEVEL info
---> Using cache
---> 9f711fe6bada
Step 6/8 : RUN pwd && ls -l /app && npm install && ls -l
---> Running in 668eb2e2c1e8
/app
total 12
-rw-r--r-- 1 root root 323 Nov 8 17:33 package.json
-rw-r--r-- 1 root root 123 Nov 8 16:59 pm2.json
drwxr-xr-x 2 root root 4096 Nov 8 18:10 src
npm info it worked if it ends with ok
npm info using [email protected]
npm info using [email protected]
... <omitting useless npm logs> ...
added 8 packages in 2.001s
npm info ok
total 20
drwxr-xr-x 10 root root 4096 Nov 8 19:49 node_modules
-rw-r--r-- 1 root root 1833 Nov 8 19:49 package-lock.json
-rw-r--r-- 1 root root 323 Nov 8 17:33 package.json
-rw-r--r-- 1 root root 123 Nov 8 16:59 pm2.json
drwxr-xr-x 2 root root 4096 Nov 8 18:10 src
---> 0d749171a431
Removing intermediate container 668eb2e2c1e8
Step 7/8 : RUN ls -l
---> Running in fc2132121c96
total 12
-rw-r--r-- 1 root root 323 Nov 8 17:33 package.json
-rw-r--r-- 1 root root 123 Nov 8 16:59 pm2.json
drwxr-xr-x 2 root root 4096 Nov 8 18:10 src
---> c689180648c9
Removing intermediate container fc2132121c96
Step 8/8 : CMD pm2-docker start pm2.json
---> Running in e70b2b89b3c8
---> 299c26f883e8
Removing intermediate container e70b2b89b3c8
Successfully built 299c26f883e8
Successfully tagged localapps/pm2_test_app:0.0.4
^^ node_modules
ディレクトリが存在し、ステップ6が終了した後に行ってもいいです注意してください!
....
しかし、ステップ7で、それがなくなってnpm install
が走って適切なディレクトリにパッケージをプルダウンすることを証明しています!さらに、最終的なイメージでは、それはなくなっています。 node_modules
の依存関係が最終的なイメージに詰まっているため、アプリケーションが動作しません。
なぜですか? node_modulesディレクトリがなければ、アプリケーションは実行されません。依存関係です。
npm_install
をビルド外で実行し、COPY
を使用してフォルダをコピーするのは有効な解決策ではありませんが、実証済みの回避策です。
私は中間のコンテナを使用していることを理解していますが、RUN
コマンドで作成されたファイルを最後まで保持させるにはどうすればよいですか?
EDIT: 詳しい調査の結果、found here dockerfile元画像はそのdockerfileでVOLUME
を宣言されていることを示している - 私の問題はどこから来るのこのですか?彼らの例では、npm install
を実行するだけですぐに動作することが示されていますが、ダウンロードしたファイルを一掃してしまうため、/app
ディレクトリを変更することから、それ以降のステップと子のイメージを壊す
VOLUME ["/app"]
:
Dockerfileで定義されたボリュームの内容を変更する動作は、定義されていません。ドッカーのバージョン、おそらく月のフェーズによって異なります。ソース画像を修正するのが最善の方法です。 – BMitch