ADDの代わりにCOPYを使用

ローカルファイルにはCOPYを使い、リモートの成果物は別途検証してください。

説明

ADDはファイルのコピーに加えて、リモートURLからのダウンロードやアーカイブの自動展開も行えます。ローカルファイルをコピーするだけなら、こうした追加の動作は不要で、Dockerfileの意図を読み取りにくくします。

ローカルファイルをイメージに入れる場合は、COPYを使うと明確です。リモートの成果物が必要な場合は、別途検証するか、対応するADD --checksumなどで完全性を確認し、ローカルコピーとダウンロードを区別してください。

想定される影響

  • コピー、展開、ダウンロードのどれを意図しているか分かりにくくなります。
  • ローカルのtarファイルが想定外に自動展開される場合があります。
  • イメージビルドの再現性や保守性が低下する可能性があります。

対処方法

  • ローカルファイルのコピーには、ADDではなくCOPYを使ってください。
  • リモートファイルが必要な場合は、チェックサムを検証する別の手順に分けてください。
  • アーカイブの展開やリモートの成果物の取得に、本当にADDが必要か確認してください。

例

ローカルJARのコピー方法を比較する既存の例です。JAR_FILEにはビルドコンテキスト内の実際のファイルを指定し、本番イメージにはサポートされているJavaバージョンを使ってください。

変更前

dockerfile
FROM openjdk:10-jdk
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

変更後

dockerfile
FROM openjdk:10-jdk
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

説明:

  • 変更前: ローカルの成果物にADDを使うと、追加の動作が入り、ビルドの予測が難しくなる場合があります。
  • 変更後: COPYでローカルコピーの意図を明示します。成果物の信頼性と完全性は別途確認してください。

参考資料