ホストから 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-api
にDockerfile
という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。
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
3000
を localhost
のポート 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/employee
に main-app
フォルダーとその内容を追加できます。これは、他の例よりもはるかに簡単です。
.dockerignore
ファイルを使用して、イメージに追加したくないファイルとフォルダーを追加できます。 次に、前の例で使用したコマンドを使用してイメージをビルドし、イメージからコンテナーを実行します。
Express アプリケーションのコードを変更していないため、出力は同じです。
これで、ディレクトリをホスト マシンからイメージのファイル システムにコピーする方法を学習しました。 ADD
および COPY
命令を使用して、あるディレクトリを別のディレクトリにコピーすることもできます。
COPY
命令を 2つのドット COPY で使用することもできます。 .
それでも同じ効果があります。
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