2020年11月17日火曜日

Gitlab CI で dind 超入門

概要

Gitlab CI で docker in docker (dind) を使ってプロジェクト内のソースを docker build してみました
手順や流れを紹介します

環境

  • macOS 10.15.7
  • docker 19.03.13
  • Gitlab 13.5.1-ee

事前準備: Gitlab の準備

コンテナレジストリを有効にした Gitlab を用意してください
過去の記事を参考にしてローカルに構築しても OK です

事前準備: Gitlab Runner を構築する

過去に Specific Runner を構築する方法を紹介しているのでそれを参考にしても OK です

だたポイントとして以下の条件を満たす Runner をインストールしてください

  • executor は docker を選択
  • Runner 上のマシンで docker が動作する
  • Runner に --docker-privileged の権限を付与

プロジェクトを作成する

プロジェクト名は test として進めます
まずはプロジェクトに push するためのアプリケーションを作成します
何でも OK ですが今回は Web アプリケーションにしてみます

  • bundle init
  • vim Gemfile
gem "sinatra"
  • vim app.rb
require 'sinatra'

get '/' do
  'ok'
end

ローカルで動作確認する場合は

  • bundle exec ruby app.rb -o 0.0.0.0
  • curl localhost:4567

で「ok」が返ってくることを確認します

一応 .gitignore を作成しておきましょう

Dockerfile を作成する

次に Dockerfile を作成します
dind を使った CI ではこの Dockerfile を元に docker build します

  • vim Dockerfile
FROM ruby:2.7

ADD . /app
WORKDIR /app

RUN bundle install

EXPOSE 4567

CMD ["bundle", "exec", "ruby", "app.rb", "-o", "0.0.0.0"]

ローカルで動作確認する場合は

  • docker build -t test .
  • docker run -d --name test -p 4567:4567 test
  • curl localhost:4567

で「ok」が返ってくることを確認します

.gitlab-ci.yml 作成する

では dind を使った docker build を行う CI のルールを作成します
今回の肝になります

使用するベースイメージは docker:19.03.13 ですが実際にビルドするイメージは docker:19.03.13-dind を指定しましょう
CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, CI_REGISTRY は gitlab が用意してくれている変数なのでこれを使って docke login や push を行います

今回は Gitlab の Container Registry に push するのでこのような指定にしていますが dockerhub などの場合には URL や ID/PW を変更してください

  • vim .gitlab-ci.yml
image: docker:19.03.13

stages:
  - build

build_image:
  stage: build
  services:
    - name: docker:19.03.13-dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:latest

push して CI が成功するか確認する

  • git init
  • git add .
  • git commit -m "First commit"
  • git remote add origin https://gitlab.example.com/root/test.git
  • git push -u origin master


これで Gitlab のプロジェクトの CI/CD を確認してみましょう

ちゃんと Gitlab の Container Registry にも push されているのが確認できると思います

最後に

Gitlab の CI/CD で docker in docker を使ってイメージビルドしてみました
Runner 側で docker executor の設定がいろいろと必要なのがポイントかなと思います

push する際のイメージ名は latest 以外にもコミットハッシュなどが変数として使えるので状況に応じて変更すると良いかなと思います

参考サイト

0 件のコメント:

コメントを投稿