2016-04-13 21 views
3

Dockerfileに次のコマンドシーケンスがあります。Dockerfile COPYはファイルの古いコピーを取りますか?

RUN sed -i "s/replace this/with that/g" ./dir/file.yaml 
COPY ./dir/file.yaml /usr/src/app/node_modules/serve-swagger-editor/node_modules/swagger-editor/spec-files/ 

これは、それが目的の場所にコピーされますfile.yaml ALMOST良いですが実行されますが、::SEDによって所定の位置に交換を注意し

  • ./dir/file.yamlは、sedのによって行われた変更が含まれています,
  • /usr/src/.../spec-files/file.yamlはありません。

それは、この問題を回避するには、COPYの問題を修正することが判明:

RUN sed -i "s/replace this/with that/g" ./dir/file.yaml 
RUN cp ./dir/file.yaml /usr/src/app/node_modules/serve-swagger-editor/node_modules/swagger-editor/spec-files/ 

誰でもこの奇妙な振る舞いを説明しますか?

答えて

2

RUNはコンテナ内でコマンドを実行しますので、sedがその中にある./dir/file.yamlファイルに適用されます。 WORKDIR/dir/file.yamlWORKDIR)に同じファイルがあると、2番目のオプションが機能する理由がわかります。

最初のバージョンのCOPYは、ホストビルドディレクトリにある./dir/file.yamlのファイル/usr/src/app/node_modules/serve-swagger-editor/node_modules/swagger-editor/spec-files/を上書きします。これはコンテナの外にあるので、前にsedコマンドの影響を受けていません。

あなたができることは、最初にコンテナ内にファイルCOPYを入れてから、RUNコマンドを使用して変更します。またはdocker buildを実行する前に変更してください。

+0

、または 'RUN'ではsedとcpを'; 'で置き換えます(Dockerfileのベストプラクティスhttps://docs.docker.com/engine/で説明されているように、いくつかのRUNは避けています)。 userguide/eng-image/dockerfile_best-practices / – user2915097

関連する問題