悩み
ある日、DockerイメージをGitLab CIで作ろうとしました。
よーし、こうしよう(以下に示す.gitlab-ci.yml
は例です。いつもの癖で)""
が多いのは許して下さい。
stages:
- build
- docker
build:
image: ubuntu
stage: build
script:
- echo some build tasks here
artifacts:
paths:
- "result.file"
docker:
image: docker
stage: docker
script:
- "sh -c \"$DOCKER_LOGIN_COMMAND\" > /dev/null"
- "docker build -t a-docker-image ."
- "docker push a-docker-image"
失敗しちゃうんですね
じゃあこうだ
stages:
- build
- docker
build:
image: ubuntu
stage: build
script:
- echo some build tasks here
artifacts:
paths:
- "result.file"
docker:
image: docker
stage: docker
script:
- service docker start
- "sh -c \"$DOCKER_LOGIN_COMMAND\" > /dev/null"
- "docker build -t a-docker-image ."
- "docker push a-docker-image"
これでも駄目
あれれー?
じゃあこうだろ?
stages:
- build
- docker
build:
image: ubuntu
stage: build
script:
- echo some build tasks here
artifacts:
paths:
- "result.file"
docker:
image: ubuntu
stage: docker
script:
- "apt update ; apt -y install apt-transport-https ca-certificates curl"
- "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -"
- "sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\""
- "apt update ; apt-get -y install docker-ce"
- service docker start
- "sh -c \"$DOCKER_LOGIN_COMMAND\" > /dev/null"
- "docker build -t a-docker-image ."
- "docker push a-docker-image"
違うんですね。
じゃあStackOverflowで聞いてこよう
ここまで来ました。もう投稿ボタンポチで終わりです。
でも、一応ググってみよう、と。
あった
あ っ た
しかもdocs.gitlab.com
にあったじゃないですかーヤーダー
そう、これ。
じゃあどうするのか
じゃあどうするの?
先に答えを示します。
stages:
- build
- docker
# 追加行 始め
variables:
DOCKER_DRIVER: overlay
services:
- docker:dind
# 追加行 終わり
build:
image: ubuntu
stage: build
script:
- echo some build tasks here
artifacts:
paths:
- "result.file"
docker:
image: docker
stage: docker
script:
- "sh -c \"$DOCKER_LOGIN_COMMAND\" > /dev/null"
- "docker build -t a-docker-image ."
- "docker push a-docker-image"
あーやっとできた
コメント除いて4行で良いんです。
DOCKER_DRIVER=overlay
の環境変数と、docker:dind
というDockerイメージが提供しているサービスを使うよう宣言すればdocker build
できる、という訳です。
最後に
このやり方に到達するまで数時間かかりました。
ググるって大事ですね