説明
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でローカルコピーの意図を明示します。成果物の信頼性と完全性は別途確認してください。