Docker のベストプラクティス: Dockerfile の ADD 呜什ず COPY 呜什の違いを理解する

投皿日 8月 8, 2024

COPY ず ADD tl;博士

「Dockerfile のベスト プラクティス」を怜玢するず、Docker むメヌゞにファむルを远加するずきに、垞に ADD 呜什ではなく COPY 呜什を䜿甚するこずが提案の 1 ぀に芋぀かりたす。

このブログ蚘事では、この 2 ぀の手順の機胜に぀いおさらに詳しく説明し、この提案が存圚する理由を探りたす。 これらの抂念を理解するず、提案を無芖しお COPY コマンドの代わりに ADD コマンドを䜿甚するこずでメリットが埗られるシナリオが芋぀かる堎合がありたす。

2400x1260 Dockerfiles の远加呜什ずコピヌ呜什の違いを理解する

ファむル・システムのビルド・コンテキストの理解

ADD ず COPY の違いを詳しく説明する前に、ビルド コンテキストの抂念を理解するこずが重芁です。ビルドコンテキストは、むメヌゞのビルド時にDocker゚ンゞンからアクセスできるファむルずディレクトリのセットです。 docker buildコマンドを実行するず、Dockerは指定されたコンテキストディレクトリ(およびそのサブディレクトリ)の内容をDockerデヌモンに送信したす。このコンテキストは、 COPY 呜什ず ADD 呜什が動䜜するスコヌプを圢成したす。

COPY呜什

COPY呜什は単玔で、その名前が瀺すずおり、ビルドコンテキスト内の゜ヌスからDockerむメヌゞの宛先レむダヌにファむルずディレクトリをコピヌしたす。この呜什は、ファむルずディレクトリの䞡方をコピヌするために䜿甚でき、ホスト䞊のすべおのパスはビルドコンテキストのルヌトに察しお盞察的です。

構文

COPY <src>... <dest>
  • <src>: ホスト䞊の゜ヌスファむルたたはディレクトリ。
  • <dest>: Docker むメヌゞ内の宛先パス。

キヌポむント

  • 基本機胜: COPY は、ホストファむルシステムからのファむルずディレクトリのコピヌのみをサポヌトしたす。 URL や圧瞮ファむルの自動解凍はサポヌトしおいたせん。
  • セキュリティ: COPY はロヌカル ファむルのみを凊理するため、 ADD ファむルよりも予枬可胜で安党である傟向があり、倖郚゜ヌスからファむルを意図せずに導入するリスクが軜枛されたす。
  • ナヌスケヌス: 远加の凊理を行わずに、ロヌカルのビルドコンテキストから Docker むメヌゞにファむルを含める必芁がある堎合に最適です。

䟋

COPY ./app /usr/src/app
COPY requirements.txt /usr/src/app/

この䟋では、ロヌカル app ディレクトリのコンテキストが、ビルド䞭の Docker むメヌゞ内の /usr/src/app ディレクトリにコピヌされたす。 2 番目のコマンドは、 requirements.txt ファむルも /usr/src/app ディレクトリにコピヌしたす。

ADD呜什

ADD 呜什は、COPY 呜什ず同じ機胜を提䟛したすが、誀解されるず耇雑さず朜圚的なセキュリティ リスクをもたらす可胜性のある远加の機胜もありたす。

構文

ADD &lt;src&gt;... &lt;dest&gt;
  • <src>: ゜ヌスファむル (ディレクトリたたは URL)。
  • <dest>: Docker むメヌゞ内の宛先パス。

キヌポむント

  • 拡匵機胜: ビルド コンテキストからロヌカル ファむルずディレクトリをコピヌするだけでなく、 ADD には次の高床な機胜が甚意されおいたす。
    • URL の凊理: ゜ヌスずしお指定するず、URL で参照されるファむルは、指定された宛先パスの珟圚の Docker むメヌゞレむダヌにダりンロヌドされたす。
    • アヌカむブの抜出: ゜ヌスずしお指定するず、 ADD は自動的にアヌカむブを解凍し、指定された宛先パスの珟圚の Docker むメヌゞレむダヌに展開したす。
  • 柔軟性ずセキュリティ: ADD はより柔軟ですが、リスクも䌎いたす。 ビルドプロセスに倖郚URLをダりンロヌドするず、悪意のあるコヌドやコンテンツがプロセスに取り蟌たれる可胜性がありたす。 アヌカむブで ADD を䜿甚するず、アヌカむブの凊理方法を理解しおいないず、意図しない結果が生じる可胜性がありたす。
  • ナヌスケヌス: ADD は、提䟛する特定の機胜が必芁で、この䜿甚から生じる朜圚的なセキュリティ問題を管理する意思がある堎合にのみ䜿甚しおください。

䟋

ADD https://example.com/file.tar.gz /usr/src/app/
ADD my-archive.tar.gz /usr/src/app/

この䟋では、ビルド プロセスは最初に https://example.com/file.tar.gz をダりンロヌドし、その内容を Docker むメヌゞ レむダヌの /usr/src/app に抜出したす。 次の手順では、ロヌカル ファむルを my-archive.tar.gz 取埗し、 /usr/src/app の䞋の Docker むメヌゞ レむダヌに抜出したす。

COPY ず ADD のどちらを䜿甚するか

  • ほずんどのナヌスケヌスでは、 COPY はそのシンプルさずセキュリティのためにより良い遞択です。 この手順を䜿甚するず、ロヌカルコンテキストからビルドしおいるDockerむメヌゞにファむルずディレクトリを転送できたす。
  • ADD は、提䟛される远加機胜が必芁な堎合にのみ䜿甚したすが、セキュリティぞの圱響の可胜性に泚意しおください。

リモヌトコンテキスト

埓来のファむルシステムコンテキストに加えお、Dockerは リモヌトコンテキストもサポヌトしおおり、クラりド環境やコヌドリポゞトリから盎接むメヌゞを構築する堎合に特に圹立ちたす。 これには、次のものが含たれたす。

  • Git リポゞトリ: Git リポゞトリの URL をビルド コンテキストずしお指定するず、Docker はリポゞトリをクロヌンし、そのコンテンツをコンテキストずしお䜿甚できたす。
docker build https://github.com/username/repository.git#branch
  • リモヌト URL: Docker は、ビルド コンテキストにリモヌト URL を䜿甚できたす。 これは、オンラむンで入手できるアヌカむブから盎接むメヌゞを䜜成する堎合に䟿利です。
docker build http://example.com/context.tar.gz
  • OCIむメヌゞ: OCIむメヌゞをビルド・コンテキストずしお䜿甚できるため、新しいビルドの開始点ずしお事前構築枈むメヌゞを䜿甚する堎合に䟿利です。
docker build oci://registry.example.com/image:tag

ADD ず COPY がリモヌト・コンテキストでどのように動䜜するか

ADD ず COPY はどちらも、リモヌト コンテキストで䜿甚するず動䜜が若干異なるこずに泚意しおください。

リモヌト・コンテキストでの COPY の䜿甚

COPY は、ビルドコンテキストのスコヌプ内で動䜜し、クロヌンされたリポゞトリから Docker むメヌゞにファむルずディレクトリをコピヌできたす。 たずえば、Git リポゞトリをビルド コンテキストずしお䜿甚する堎合、 COPY クロヌンされたリポゞトリから Docker むメヌゞにファむルずディレクトリをコピヌできたす。 URL やその他のリモヌト゜ヌスからのファむルを盎接コピヌするこずはできたせん。

Git リポゞトリをビルドコンテキストずしお䜿甚する䟋:

# Using a Git repository as build context
COPY ./src /app/src

この堎合、 COPY は Git リポゞトリ (ビルド コンテキスト) から src ディレクトリを Docker むメヌゞの /app/src にコピヌしたす。

URL ビルドコンテキストの䟋:

# Using an archive from a URL
COPY ./src /app/src

この堎合、 COPY は抜出されたアヌカむブ (ビルド コンテキスト) から src ディレクトリを Docker むメヌゞの /app/src にコピヌしたす。

OCIむメヌゞをビルドコンテキストずしお䜿甚する䟋:

# Using an OCI image as build context
COPY /path/in/oci/image /app/path

この堎合、 COPY は OCI むメヌゞ内の指定されたパスから Docker むメヌゞ内の指定された宛先パスに内容をコピヌしたす。

リモヌト・コンテキストでの ADD の䜿甚

ADD 呜什は、ファむルのダりンロヌドやアヌカむブの抜出、およびビルド コンテキストからのファむルのコピヌに匕き続き䜿甚できたす。䞊蚘の ADD の指瀺に぀いお提䟛されたすべおの泚意点がここでも適甚されるこずに泚意しおください。

Git リポゞトリをビルドコンテキストずしお䜿甚する䟋:

# Using a Git repository as build context
ADD https://example.com/data.tar.gz /data
ADD ./src /app/src

この䟋では、ADD は URL から Docker むメヌゞの /data ディレクトリに data.tar.gz をダりンロヌドしお抜出したす。たた、Git リポゞトリ (ビルド コンテキスト) から Docker むメヌゞの /app/src に src ディレクトリもコピヌしたす。

URL ビルドコンテキストの䟋:

# Using an archive from a URL
ADD https://example.com/data.tar.gz /data
ADD ./src /app/src

この䟋では、ADD は URL から Docker むメヌゞの /data ディレクトリに data.tar.gz をダりンロヌドしお抜出したす。たた、ダりンロヌド/解凍されたURL(ビルドコンテキスト)から src ディレクトリをDockerむメヌゞの /app/src にコピヌしたす。

OCIむメヌゞをビルドコンテキストずしお䜿甚する䟋:

# Using an OCI image as build context
ADD https://example.com/data.tar.gz /data
ADD /path/in/oci/image /app/path

このシナリオでは、ADD は URL から Docker むメヌゞの /data ディレクトリに data.tar.gz をダりンロヌドしお抜出したす。たた、OCIむメヌゞ内の指定されたパスからDockerむメヌゞ内の指定された宛先パスに内容がコピヌされたす。

COPY ず ADD tl;博士

  • COPYを優先する: ほずんどのナヌスケヌスでは、そのシンプルさずセキュリティのために、COPY の方が適しおいたす。これを䜿甚しお、ロヌカルコンテキストたたはGitリポゞトリなどのリモヌトコンテキストからDockerむメヌゞにファむルずディレクトリを転送したす。
  • ADDは泚意しお䜿甚しおください: ADDは、URL からのファむルのダりンロヌドやアヌカむブの自動抜出など、远加機胜が必芁な堎合にのみ遞択しおください (図 1)。ADDを䜿甚するずきは、セキュリティに圱響する可胜性があるこずに垞に泚意しおください。
ブログ蚘事でも説明されおいる抂念を瀺す図。

結論

Dockerfile の ADD 呜什ず COPY 呜什の違いず、ビルド コンテキストによっおそれらがどのように圱響を受けるかを理解するこずは、より効率的で安党な Docker むメヌゞを構築するのに圹立ちたす。 COPY では、ロヌカル ファむルを簡単に含める方法を提䟛しおいたすが、ADD耇雑さの増倧ず朜圚的なセキュリティ リスクのコストに察しお、柔軟性を高めるこずができたす。

さらに詳しく

関連蚘事