ホストから Docker イメージへのディレクトリのコピー

David Mbochi Njonge 2023年6月20日
  1. エクスプレス アプリケーションの作成
  2. ADD 命令を使用する
  3. COPY 命令を使用する
  4. ADD 命令の代替を使用する
ホストから Docker イメージへのディレクトリのコピー

Docker のドキュメント では、Docker をインフラストラクチャに依存しないツールとして定義しており、開発者がアプリケーションを可能な限り迅速に開発、出荷、実行するのに役立ちます。

これらの利点とは別に、DevOps 開発者は Docker を継続的な統合、配信、および展開にも使用します。 この開発アプローチは通常CI/CDと呼ばれ、開発者はコンテナを使用して、変更や機能を開発、テスト、本番環境にデプロイします。

アプリケーションのバグは、開発環境で修正されます。 これが完了すると、テスト環境で自動化テストが実行されます。 最後に、すべてのテストに合格すると、新しい変更が加えられたイメージが本番環境にデプロイされます。

このチュートリアルでは、ディレクトリをホスト マシンから Docker イメージにコピーする方法を説明します。 これを実現するために、API を返す高速アプリケーションを使用します。

エクスプレス アプリケーションの作成

Intellij IDEA を開きます。 ファイル -> 新規 –> プロジェクト を選択します。 開いたウィンドウで、左側の Node.js を選択し、プロジェクト名を untitled から employee-api に変更します。 最後に、Create ボタンを押してプロジェクトを生成します。

アプリケーションに Express をインストールするには、View > Tool Windows > Terminal を選択して Intellij IDEA で新しいターミナル ウィンドウを開き、次のコマンドを使用して Express をインストールします。

~/WebstormProjects/employee-api$ npm install express

Express をインストールしたら、employee-api フォルダーに main-app という名前のフォルダーを作成します。 次に、API を作成するために、index.js という名前のファイルを main-app フォルダーに作成し、次のコード フェンスをコピーしてそのファイルに貼り付けます。

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.json(
        [{
            name: 'Bob',
            email: "bob@gmail.com"
        },
            {
                name: 'Alice',
                email: 'alice@gmail.com'
            },
        ])
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

このファイルでは、ポート 3000 を公開する高速アプリケーションを作成しており、パス / へのリクエストは従業員の配列を返します。 以下のセクションで取り上げるすべての例で、このアプリケーションを使用します。

ADD 命令を使用する

ベースフォルダーemployee-apiDockerfileという名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD main-app /com/employee/main-app
CMD node main-app/index.js

アプリケーションのカスタム イメージを作成するには、通常、この例に示すように、Dockerfile という名前のファイルを使用します。 次のセクションでは、ファイルで使用される各コマンドの意味を定義します。 私たちの懸念は、最後の 2 行目の ADD コマンドです。

前のコード例で使用されているすべてのコマンドについて、以下で簡単に説明します。

  • FROM - Dockerfile で宣言される最初のコマンドであり、その主な目的は、イメージのビルドに使用する基本イメージを宣言することです。 基本イメージはパブリック リポジトリからプルされることに注意してください。
  • WORKDIR - 作業ディレクトリを設定し、他の手順で設定しなくても作業ディレクトリが作成されます。
  • ADD - ソースから宛先にファイルまたはフォルダーをコピーします。 通常、ソースはホスト マシンであり、宛先はコンテナーのファイル システムです。
  • RUN - 既存のイメージの上で提供されたコマンドを実行し、実行結果を含む新しいイメージを返します。 この場合、コマンドは依存関係を現在のイメージにインストールします。 そして、結果のイメージには依存関係が装備されています。
  • CMD - コンテナをスピンアップすると、この命令は、実行可能ファイルやエントリ ポイント命令など、コンテナのデフォルトを提供します。 この場合、命令のシェル形式を使用しました。 さらに、コンテナのデフォルトとして実行可能ファイルを提供しました。

ADD 命令を使用して、main-app ディレクトリをホスト マシンから作業ディレクトリ /com/employee/main-app に作成された新しいディレクトリにコピーしたことに注意してください。 これを実際に確認するには、次のコマンドを使用して、タグ employee-api を持つイメージを作成します。

~/WebstormProjects/employee-api$ docker build --tag employee-api:latest.

ビルドが成功するまで、コンソールの最初の 5つの指示に従ってください。 次に、以下に示すように、実行中の命令が表示されることを確認します。

 => [1/5] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6997b                         0.0s
 => [internal] load build context                                                                                                                    0.1s
 => => transferring context: 137B                                                                                                                    0.0s
 => CACHED [2/5] WORKDIR /com/employee                                                                                                               0.0s
 => CACHED [3/5] ADD package*.json ./                                                                                                                0.0s
 => CACHED [4/5] RUN npm install                                                                                                                     0.0s
 => CACHED [5/5] ADD main-app /com/employee/main-app  

イメージからコンテナーを実行すると、最後の命令が実行されます。 たとえば、次のコマンドを使用して、イメージからコンテナーを実行します。

~/WebstormProjects/employee-api$ docker run --name employee-service -d -p 3000:3000 employee-api:latest 

このコマンドは、デタッチ モード -d でイメージ employee-api を使用して employee-service という名前のコンテナーを実行し、ポート -p 3000localhost のポート 3000 にマップします。

アプリケーションが期待どおりに動作しているかどうかを確認するには、localhost:3000 (http://localhost:3000/) に移動して従業員データを取得します。 以下は、リクエストから返された JSON 配列です。

[
    {
    "name": "Bob",
    "email": "bob@gmail.com"
    },
    {
    "name": "Alice",
    "email": "alice@gmail.com"
    }
]

COPY 命令を使用する

Dockerfile という名前のファイルの指示についてコメントし、次のコードをコピーしてファイルのコメントの後に貼り付けます。

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
COPY main-app /com/employee/main-app
CMD node main-app/index.js

これらの手順は、前の例と同じであることに注意してください。 行った唯一の変更は、最後の 2 行目の ADD 命令を COPY 命令に置き換えたことです。

COPY - ソースから宛先にファイルまたはフォルダーをコピーします。 通常、ソースはホスト マシンであり、宛先はコンテナーのファイル システムです。

COPY 命令は ADD 命令と似ていることに注意してください。これらは同じ目的を達成するからです。 これを実際に確認するには、前の例で使用したコマンドを使用してイメージを作成し、イメージからコンテナーを実行します。

新しいイメージを作成することも、既存のイメージを再作成することもできます。 既存のイメージを再作成するには、実行中のコンテナーを停止し、コンテナーを削除して、イメージを削除する必要があります。 次のコマンドを使用して、それぞれの手順を実行します。

~/WebstormProjects/employee-api$ docker stop employee-service 
~/WebstormProjects/employee-api$ docker rm -f employee-service 
~/WebstormProjects/employee-api$ docker rmi -f employee-api:latest 

ADD 命令の代替を使用する

Dockerfile という名前のファイルの指示についてコメントし、次のコードをコピーしてファイルのコメントの後に貼り付けます。

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD . .
CMD node main-app/index.js

この例は前の例と似ていることに注意してください。唯一の変更点は、COPY 命令を ADD 命令に置き換えたことです。 この例の ADD 命令は、2つのドット を使用します。 . ソースと宛先を指定します。

これは、現在のディレクトリのすべての内容を作業ディレクトリにコピーすることを示しています。 したがって、たとえば、このコマンドを使用すると、イメージの作業ディレクトリ /com/employeemain-app フォルダーとその内容を追加できます。これは、他の例よりもはるかに簡単です。

.dockerignore ファイルを使用して、イメージに追加したくないファイルとフォルダーを追加できます。 次に、前の例で使用したコマンドを使用してイメージをビルドし、イメージからコンテナーを実行します。

Express アプリケーションのコードを変更していないため、出力は同じです。

これで、ディレクトリをホスト マシンからイメージのファイル システムにコピーする方法を学習しました。 ADD および COPY 命令を使用して、あるディレクトリを別のディレクトリにコピーすることもできます。

COPY 命令を 2つのドット COPY で使用することもできます。 . それでも同じ効果があります。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

関連記事 - Docker Directory