CircleCIでdocker buildするまで
5月に引っ越しが終わって、
それから自分のサイト構築を進めてました。
とりあえずベース部分まで出来たので一旦書き出しておこうと思います。
ブログ、全然書いてませんでしたからね……。
ただ、全部書くと量が多いので3つに分けながら進めて行きます。
- CircleCI で docker build するまで <- イマココ
- CircleCI からECRへ自動push
- CircleCI からECSへ自動デプロイ
要はCI/CD環境を用意したって話です。
そういえばもうCircleCIって書いても、バージョン2の方で良いですよね。
使用したGitリポジトリはここ
github.com
DockerFileの用意
dockerの環境構築が本題ではないのでそこら辺は割愛して、
使用するDockerfileがこちら。
FROM node:12-stretch # install nginx RUN curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add - RUN echo 'deb http://nginx.org/packages/debian/ stretch nginx\n\ deb-src http://nginx.org/packages/debian/ stretch nginx' > /etc/apt/sources.list.d/nginx.list RUN apt update && apt remove -y nginx && apt install -y nginx && apt clean COPY ./file/mu-web.conf /etc/nginx/conf.d/ EXPOSE 80 CMD /usr/sbin/nginx -g "daemon off;"
1行目のベースとするDocker ImageはCircleCIに存在するNode.jsのイメージを利用します。
タグは Node.jsのバージョン-Debianのコードネーム
になっています。
Pre-Built CircleCI Docker Images - CircleCI
因みに、利用可能なイメージのタグ一覧はここ
後はnginxをインストールして、設定ファイルを配置。
最後にnginxをデーモンとしてではなく、フォアグランドで起動することでコンテナが終了しないようにしています。
CircleCIの設定
えー、流石にもう最初にどうUIポチポチして連携したか覚えてない……。
確かどのリポジトリと連携するかをやったと思います。
そして、対象リポジトリに .circleci/config.yml
を配置することでジョブが実行されていきます。
ファイルペタペタで申し訳ないが、作成した .circleci/config.yml
はこれ。
version: 2 jobs: build: docker: - image: circleci/node:12-stretch steps: - checkout - setup_remote_docker - run: name: Docker image build command: docker build -t mu-web . - run: name: Check docker run command: | docker run -d --name mu-web-container mu-web docker exec mu-web-container curl --retry 10 --retry-connrefused http://localhost/status | grep 'Connection OK' - run: name: Save docker image command: docker image save mu-web > ./mu-web.tar - persist_to_workspace: root: . paths: - ./mu-web.tar workflows: version: 2 build: jobs: - build
jobs
で実行するジョブを定義していきます。
今回だと build
というジョブを定義しています。
そしてジョブでは、どのdockerイメージを使って、何を実行していくかを定義しています。
steps
の中に、checkout
, setup_remote_docker
というのがありますが、
これはCircleCIがビルド毎にリモート環境を構築するために必要なコマンドです。
その後に、docker buildしています。
さて、タイトルでbuildするまでとか言いましたが、その後に2ステップ挟んでいます。
1つ目はビルドしたイメージで想定した通りに起動しているかの確認です。
正直、別に入れなくても良かったかなと思っている代物です。
nginxの設定で以下を追加しておくと、localhostでの接続の際に文字列を返してくれます。
そのチェックをして、nginx動いているなーって確認してます。
server { listen 127.0.0.1:80; location /status { return 200 'Connection OK'; } }
2つ目はイメージを保存しています。
これは次回のECRにpushするイメージをまた生成させる必要がないので
既にビルドしたイメージを保存して流用しようとしたものです。
先ほどジョブごとに環境が~みたいなことを書きましたが、
persist_to_workspace
の設定をしてあげるとワークフロー間で対象を共有できます。
なので、そこに作成したtarファイルを追加しておきます。
そうして、jobs
の定義が済んだら
ジョブをどう繋げるかのworkflows
の設定をします。
ここでは単純にbuild
ジョブを実行するだけですが、他にも実行に制限を掛ける機構が備わっています。
これはここまでです。
次回、ECRにpushするまでを書きたいと思います。
思いますが、一体どれほど覚えているかな……。そんなにないはず……。