概要
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 件のコメント:
コメントを投稿