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 要件が存在する場合、コンビニエンスイメージが CircleCI で提供できていない場合があります。

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

Dockerfile の作成方法

Dockerfile Wizard

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' を追加すると、コンテナ内に作業ディレクトリが設定されます。 以後のコマンドは常にこのディレクトリ上で実行され、一種の 'root' フォルダーとして機能します。

WORKDIR /app

COPY

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

COPY install.sh .

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

RUN

ベースイメージが配置されたコンテナは実行可能ですが、ビルドを実行するには足りない機能があります。 シェル内で RUN コマンドを実行すると、ローカルと同様に実行されます。

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 上で使用可能になります。

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

コメント

0件のコメント

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