2017-11-08 14 views
1

私は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)に保持されているファイルのみ

は、私はCOPYコマンドここ

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"] 

+0

Dockerfileで定義されたボリュームの内容を変更する動作は、定義されていません。ドッカーのバージョン、おそらく月のフェーズによって異なります。ソース画像を修正するのが最善の方法です。 – BMitch

答えて

3

keymetrics/PM2の画像は、そのDockerfileに次の行が含まれています。 docker's documentationから:Dockerfile内から音量を変更

:それが宣言された後の任意のビルド手順は、ボリューム内のデータを変更した場合、それらの変更は破棄されます。

あなたは、別のディレクトリにビルドを実行することで、その行せずに別のベースイメージを作成し、またはその行を削除するには、上流作者を説得する必要があります

私は前にblogged about the issues with volumes defined in Dockerfilesでした。これはこれらの問題の1つです。実際にDockerfileにこの行があることには、何のメリットもありません。

+0

良い発見、ありがとう - 「COPY」コマンドを使って私が明示的にコピーしたファイルがボリュームに残っていた理由を知っていますか?それらは捨てられなかった。 – emmdee

+0

これは実際には定義されていないシナリオです。コピーするものもあれば、コピーしないものもあります。 'COPY'コマンドを含む単一のファイルは、コピーするものの1つに見えますが、それはドッカーのバージョンにも依存するかもしれません。それに対処するよりも、私はその行を削除し、潜在的な問題をすべて回避します。 – BMitch

+0

私は新しいベースイメージを作成するつもりだと思うのですが、これはおそらく、これを解決する最もクリーンで最も簡単な方法でしょうか? これをkeymetricsに送信しますが、結果が得られない可能性があります。 – emmdee

関連する問題