1. 序章

.Gitは、ソフトウェア開発のための主要なバージョン管理システムです。 一方、Dockerfileには、アプリケーションのイメージを自動的に構築するためのすべてのコマンドが含まれています。 これら2つの製品は、DevOpsを採用しようとしている人にとって完璧な組み合わせです。

このチュートリアルでは、これら2つのテクノロジーを組み合わせるためのいくつかのソリューションを学習します。 各ソリューションの詳細を説明し、その長所と短所について説明します。

2. Gitリポジトリ内のDockerfile

Dockerfile内のGitリポジトリに常にアクセスするための最も簡単な解決策は、DockerfileをGitリポジトリに直接保持することです。

ProjectFolder/
  .git/
  src/
  pom.xml
  Dockerfile
  ...

上記の設定により、プロジェクトのソースディレクトリ全体にアクセスできるようになります。 次に、ADDコマンドを使用してコンテナに含めることができます。次に例を示します。

ADD . /project/

もちろん、ビルドディレクトリへのコピーの範囲を制限することもできます。

ADD /build/ /project/

または.jarファイルのようなビルド出力:

ADD /output/project.jar /project/

このソリューションの最大の利点は、リポジトリにコミットせずにコードの変更をテストできることです。 すべてが同じローカルディレクトリに存在します。

ここで覚えておくべきことの1つは、 .dockerignoreファイル .gitignore ファイルに似ていますが、この場合、Dockerコンテキストからその中のパターンに一致するファイルとディレクトリを除外します。 これにより、大きなファイルや機密性の高いファイルやディレクトリをDockerビルドプロセスに不必要に送信したり、イメージに追加したりすることを回避できます。

3. Gitリポジトリのクローンを作成する

もう1つの簡単な解決策は、イメージのビルドプロセス中にgitリポジトリをフェッチすることです。 SSHキーをローカルストアに追加し、を呼び出すだけで実現できます。 git clone 指図:

ADD ssh-private-key /root/.ssh/id_rsa
RUN git clone [email protected]:eugenp/tutorials.git

上記のコマンドは、リポジトリ全体をフェッチして、コンテナの./tutorialsディレクトリに配置します。

残念ながら、このソリューションにはいくつかの欠点もあります。

まず、潜在的なセキュリティ問題を引き起こす可能性のあるDockerイメージにプライベートSSHキーを保存します。 gitリポジトリのユーザー名とパスワードを使用して回避策を適用できます。

ARG username=$GIT_USERNAME
ARG password=$GIT_PASSWORD
RUN git clone https://username:[email protected]:eugenp/tutorials.git

そしてそれらを環境変数として私たちのマシンから渡します。 このようにして、gitクレデンシャルをイメージの外に保持します。

次に、リポジトリが変更された場合でも、このステップは後のビルドでキャッシュされます。 それは 実行 前のステップでキャッシュを解除しない限り、コマンドは変更されません。 ただし、追加することで解決できます –キャッシュなし のパラメータ Dockerビルド 指図。

もう1つの小さな欠点は、gitパッケージをコンテナーにインストールする必要があることです。

4. ボリュームマッピング

使用できる3番目のソリューションは、ボリュームマッピングです。 これにより、マシンからDockerコンテナにディレクトリをマウントできるようになります。 これは、Dockerコンテナで使用されるデータを保存するための推奨されるメカニズムです。

Dockerfileに次の行を追加することでそれを行うことができます。

VOLUME /build/ /project/

これにより、コンテナに / project ディレクトリが作成され、マシンの /buildディレクトリにマウントされます。

Gitリポジトリをビルドプロセスのみに使用する場合は、ボリュームマッピングが最適です。 リポジトリをコンテナの外部に保持することで、そのサイズを大きくすることなく、リポジトリのコンテンツを特定のコンテナのライフサイクルの外部に置くことができます。

覚えておく必要があることの1つは、ボリュームマッピングにより、Dockerコンテナにマウントされたディレクトリへの書き込みアクセスが許可されることです。 この機能を不適切に使用すると、gitリポジトリディレクトリに不要な変更が加えられる可能性があります。

5. Gitサブモジュール

Dockerfileとソースコードを別々のリポジトリに保持する場合、またはDockerビルドに複数のソースリポジトリが必要な場合は、Gitサブモジュールの使用を検討してください。

まず、新しいGitリポジトリを作成し、そこにDockerfileを配置する必要があります。 次に、サブモジュールを.gitmodulesファイルに追加して定義できます。

[submodule "project"]
  path = project
  url = https://github.com/eugenp/tutorials.git
  branch = master

これで、サブモジュールを標準ディレクトリのように使用できます。 たとえば、そのコンテンツをコンテナにコピーできます。

ADD /build/ /project/

サブモジュールは自動的に更新されないことに注意してください。 最新の変更を取得するには、次のgitコマンドを実行する必要があります。

git submodule update --init --recursive

6. 概要

このチュートリアルでは、Dockerfile内でGitリポジトリを使用するいくつかの方法を学びました。 いつものように、すべてのソースコードはGitHub利用できます。