CircleCI 用のカスタム Docker イメージを作成する方法

CircleCI は config.yml で開始されますが、ビルドのベースは Dockerfile で開始されます。

Docker を初めて使用する場合は、公式のスタートガイドを確認してください。

https://docs.docker.com/get-started/

 

 

Dockerfile とは

Docker は、Dockerfile に記述されている情報をもとに、イメージを自動的にビルドします。 これは、実行するオペレーティングシステムを定義し、プロジェクトに必要なソフトウェアまたは依存関係をインストールし、シェルで自動的にコマンドを実行します。

 

CircleCI のユーザーの多くは、同じような環境とツールを必要としているため、CircleCI 上のプロジェクトに最適な Dockerfiles を選択して保守し、さまざまな言語用に提供しています。 これらの "ビルド済み" Docker イメージは、https://hub.docker.com/r/circleci/ で参照できます。

 

カスタム Dockerfile を作成する理由

CircleCI のイメージを使用して、お客様独自のツールをその上にインストールできますが、それがお客様のユースケースにおいて最も効率的な方法とは限りません。 多くのソフトウェアを使用しており、毎回それらを使用する必要がある場合、ビルドを実行するたびに CircleCI にインストールするよりも、ベース Docker イメージを利用することをおすすめします。 ただし、独自の OS 要件が存在する場合、現在のところそれに適したビルド済み Docker イメージを CircleCI では用意していません。

この点について、お気付きのことがありましたらお知らせください:https://circleci.com/ideas/

 

Dockerfile の作成方法

Dockerfile ウィザード

https://github.com/CircleCI-Public/dockerfile-wizard

このツールは、Linux および MacOS で、CircleCI で使用する Dockerfiles を生成するための、自動化スクリプトです。 このスクリプトは、オペレーティングシステム、ツール、データベースなどについて、いくつかの一般的なオプションの指定を求めます。 スクリプトが完了すると、CircleCI の config.yml が生成されます。 プロジェクトをコミットし、CircleCI ダッシュボードから、それに従ってビルドを開始します。

新しいプロジェクトは、新たに作成された Dockerfile をビルドし、イメージを自動的に Dockerhub へプッシュします。

Docker イメージがパブリッシュされた後で、`test_image` ジョブが開始され、新たに作成された Docker イメージが Dockerhub からプルされます。

詳細については、https://circleci.com/blog/build-custom-docker-images-faster-and-more-easily-with-our-dockerfile-wizard/ を参照してください。

 

独自の Dockerfile コードの作成

独自の Dockerfile をビルドすると、より細かく制御できます。

公式ドキュメント:https://docs.docker.com/engine/reference/builder

 

好きな名前の空白のフォルダを選び、cd でそのフォルダーに移動します。

mkdir mydockerfile

cd mydockerfile

このフォルダー内に Dockerfile を置く必要があるため、それに応じた名前を使用してください。

touch Dockerfile

このファイルは、好きなテキストエディターで開くことができます。

FROM コマンド

'FROM' コマンドは、Dockerfile の最も重要なコマンドのひとつです。 これは、Docker ビルドのベースイメージを指定します。 これはほとんどの場合 Linux ディストリビューションですが、他のオプションも存在します。 DockerHub を探して、Dockerfile に最適なベースイメージを見つけることができます。

すべてのイメージには pull コマンドが示されており、イメージ名もこれによって示されます。


 

また、そのベースイメージで利用可能なタグも見つけられます。 タグは通常、ベースイメージと異なるバージョンやバリエーションです。 タグがないと、常に最新のイメージがプルされることになります。ビルドが整合していることを保証するには、タグも選択します。



 

イメージとタグを選択したら、次のように 'FROM' 行に挿入します。

FROM alpine/3.5

 

WORKDIR の設定

'WORKDIR' を追加すると、コンテナ内に作業ディレクトリが設定されます。 これは、以後のコマンドのターゲットとなり、一種の 'ルート' フォルダーとして機能します。

WORKDIR /app

 

COPY コマンド

まず試しに、使用するオペレーティングシステムにスクリプトを送ってみますが、 これはあくまでもオプションです。 それでは、ルートディレクトリに install.sh という名前のスクリプトと、Dockerfile があるとします。 行なうべき操作は、このスクリプトを実行中の Docker コンテナにコピーすることです。 このためには、'FROM' コマンドの下に 'COPY' を追加します。 COPY のパラメーターは 2 つで、1 番目はソース、2 番目はコピー先です。

COPY install.sh .

既に 'WORKDIR' を設定している場合は、このコマンドは install.sh/app/install.sh にコピーします。

 

RUN コマンド

ベースイメージが配置されたコンテナは実行可能ですが、多くの機能を果たしません。 シェル内で RUN コマンドを実行すると、ローカルと同様に OS を管理できます。

RUN install.sh

'RUN' は非常に強力なコマンドで、ターミナルで実行可能なすべての操作を行なえます。 上のコマンドは、/app/install.sh を実行します。

 

レイヤーとイメージサイズの最小化

Dockerfiles 作成のベストプラクティス:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

CircleCI のビルド済み Docker イメージを使用する大きな理由の 1 つは、イメージのレイヤーがホストにキャッシュされている可能性が高いため、スピンアップ時間を減らせることです。 しかし、イメージを小さくすることが望ましい、または CircleCI のイメージでは解決できない要求が存在する場合もあります。

ビルド内のレイヤー数とビルドの合計サイズを制限することはとても重要です。

ADDCOPYRUN コマンドを使用するごとに、ビルドにレイヤーが追加されます。 ですので、可能な限りコマンドをチェーンしてください。

Run apt-get update && apt-get upgrade -y \

    apt-get install -y nodejs npm

または、マルチステージのビルドを試してみることもできます:https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds

 

小さなベースイメージから始める

一般に利用可能な多くのベースイメージには、特定のプロジェクトには必要ない多くのツールが付属しています。

Ubuntu Trusty イメージは、圧縮状態で 43MB です (展開すると 100MB を大きく超えます)。プロジェクトによってはこのような大きなイメージは必要でなく、2MB の Alpine で十分な場合もあります。

 

イメージのビルド

https://docs.docker.com/engine/reference/commandline/build/

ローカルマシンでターミナルを使用し、プロジェクトのルートディレクトリで次のコマンドを入力します。

docker build -t IMAGENAME/TAG

このコマンドにより、イメージのビルドが開始され、名前が付けられます。 TAG はオプションです。

Dockerhub へのプッシュ

ユーザーの Docker ビルドをリポジトリにデプロイする方法は数多く存在しますが、ここではイメージを Dockerhub にプッシュする方法について説明します。

Dockerhub にログインします。

docker login -u USERNAME -p PASSWORD< /code>

ログインすると、Docker にビルドを提出できます。

docker push IMAGENAME/TAG 

 

これで完了です。

Docker イメージが、プロファイル上の Dockerhub で使用可能になります。

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています

コメント

0件のコメント

ログインしてコメントを残してください。