はじめに

ソフトウェアでいうコンテナは、元は運輸業界でいうコンテナに由来しているわけですが、どちらのコンテナも類似するメリットを備えています。

コンテナ(運輸) コンテナ(ソフトウェア)
船や列車に乗せられる Windows/Mac/Linux等で動かせる
荷物をまとめて積載できる 必要なコード、ライブラリ、データをまとめて配布できる
輸送効率がアップする 開発・ビルド・テスト・デプロイ効率がアップする

これらのメリットをソフトウェア開発において享受するためのステップとして、

  1. 開発環境を共通化するためのCircleCIによるDockerイメージの作成(本ブログ)
  2. Dockerコンテナ上での開発
  3. 実行環境を共通化するためのCircleCIによるDockerイメージの作成

をご紹介していきます。

なお、本ブログは2020年9月に開催した「CircleCIを学ぼうシリーズ 第1弾 カスタムDockerイメージの作成」での内容を基にしています。

コンテナ作成の流れ: 1. Dockerfile作成

今回は、「Node.js + expressで動作するウェブサービスを開発」でき、「jest + mocha + supertestを使ってテスト」できるようなDockerコンテナを作成してみます。 開発者にとってコンテナを使うことのメリットは、自分の使っているPC上の環境をプロジェクトごとに異なりうる「標準」に合わせる必要がなにかに合わせる必要がなくなることです。 Node.jsや必要なライブラリの特定のバージョンを探して、依存関係を気にしながらインストールして環境構築する必要はありません。 必要なライブラリやツールがすべて揃ったコンテナ上で開発をすぐに始めることができます。

それでは、開発・テスト用のコンテナを作成していきます。

まず、GitHub上にリポジトリを作成します。 筆者はCCI-Img-Nodeというリポジトリを作成しました(https://github.com/mfunaki/CCI-Img-Node)。

次に、リポジトリ内のルートディレクトリにDockerfileファイルを作成します。

### 開発用コンテナの構築
FROM node:12

# ワーキングディレクトリの設定
WORKDIR /node-app

# 初期設定(package.json生成)
RUN npm init -y

# expressインストール
RUN npm install express

# テスト環境(jest, mocha, supertest)インストール
RUN npm install jest mocha supertest

なお、Dockerコンテナのイメージ作成に関しては、CircleCIブログ「カスタム Docker イメージを作成して CI ビルドを実行する」にも説明があります。

コンテナ作成の流れ: 2. config.yaml作成

コンテナイメージを作成するには、Dockerfileファイル中に必要な内容を定義し、docker buildコマンドでビルドするのが一般的です。 今回は、CircleCIを使い、クラウド側でイメージ作成を行い、DockerHubに登録する方法を紹介します。 CircleCIを使うことで、例えばコンテナイメージを修正したい際に、元イメージの作成者が自分のPCが手元にないと修正が進められなくなるといった「人依存」「PC依存」に陥ることがなくなります。

したがって、コンテナイメージの作成においては、最低限必要なのは、github.comcircleci.comにアクセス可能なウェブブラウザということになります。Dockerやgitコマンド、Node.js等をあらかじめインストールしておかなくても(極端な例を挙げればスマートフォンからでも)開発インフラ整備や強化・修正が行えるということになります。

それでは、CircleCIでDockerコンテナのイメージを構築するために、リポジトリ内に.circleciディレクトリを作成します。 .circleciディレクトリの中にはconfig.ymlファイルを用意します。

version: 2.1

jobs:
  build:
    docker:
      - image: cibuilds/docker:latest
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: "Build a Docker image"
          command: |
            docker build -t mfunaki/cci-img-node .
      - run:
          name: "Push to DockerHub"
          command: |
            echo "$DOCKER_PASS" | docker login --username $DOCKER_USER --password-stdin && \
            docker push mfunaki/cci-img-node

上に挙げたconfig.ymlの中について、何点か説明をしていきましょう。

imageのところに指定されたDockerイメージですが、ここではCI向けに最適化されたCI Buildsイメージを使用しています。 具体的には、Dockerイメージビルド用の cibuilds/dockerを指定しています。

docker build -t の後のタグ名や docker push の後のコンテナ名は適宜、ご自身で命名の上、設定してください。

コンテナ作成の流れ: 3. コンテナ作成+登録

ここまで用意できたら、CircleCIにログインします。 作成したGitHubリポジトリをCircleCIのプロジェクトとして登録することで、クラウド側でDockerイメージを作成し、DockerHubへプッシュできます。

なお、完了するには、config.yml中のdocker loginで使用している $DOCKER_PASS(パスワード)や$DOCKER_USER(ユーザ名)に対応する環境変数を設定しておきます。 つまり、他人に見られると問題のあるセキュリティ情報はconfig.ymlに直接記述するのではなく、CircleCIの環境変数として設定から設定するようにします。

2020-09-24-masahiko-01.png

さいごに

開発のインフラ整備までが完了しました。その2では、本稿で作成したDockerコンテナのイメージを手元のPC上で起動し、必要な環境の揃ったコンテナの中で開発を進める方法を紹介していきます。Node.jsや必要なライブラリをインストールしたり、バージョンを気にすることなく開発を進めることができます。