0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dockerfileの`COPY`に注意せよ!

Posted at

畑田です。
最近チーム内での開発でDockerfileを書くことがしばしばあるのですが、いくつ書きになる点があったので整理しました。
その中でもADDCOPYの違いとともに**COPYにおける注意点**をまとめておきます。

DockerfileのADDCOPYについて

ADDCOPYは機能が似ていますが、COPYが単にlocalのファイルをcontainerにコピーするだけなのに対して、ADDはtarファイルの展開やremote URLからのデータの取得をサポートしています。
したがって、localファイルのコピーを意図しているときにはより限定的な意味のCOPYを用いることがdockerによって推奨されています。
さらに、ADDによってremote URLを用いてリソースを取得することは非推奨とされており、curlwgetRUNコマンドによって実行することが推奨されます。
このため、ADDコマンドはtar展開などを含んだcontainerへのリソース追加に適用することが推奨されていると考えられます。

DockerfileのCOPYにおける注意点

上の項目でも推奨しているCOPYについて、directoryをコピーするときに注意する必要があります。
まず、以下のようにファイルをコピーするときにはなんら問題は生じません。

COPY ./package*.json ./

しかし、次のようにdirectory自体をコピーしようとするときに問題は生じます。

COPY ./src/ ./

このように書いてしまうと、host machineの./src/の中身がcontainer machineの./のなかに展開されてコピーされてしまいます。(イメージはJavaScriptの[...data]です。違うか。)
つまり、container machineの./が空であれば、container machineの./はhost machineの./src/と全く同じものになるし、もともと中身が入っていればmergeされてしまうということです。
展開せずにcontainer machineの./の下に./srcとしてコピーしたい場合は以下のように記述してください。

COPY ./src/ ./src/

この仕様に若干の違和感があるのは、Linux系共通コマンドである以下のものと仕様が異なるからだと思います。

$ cp -r DIRECTORY_NAME DESTINATION
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?