Docker-in-Docker (dind) を使わないでという記事を見つけた.
Using Docker-in-Docker for your CI or testing environment? Think twice.
dindを使おうと思っているなら,もう一度考え直すのだ.dindはDockerそのものの開発のために作られたものなのだ.dindはいろいろと問題が出てくるので,使わない方がよいのだ.Dockerで実行するアプリケーションでDockerを使いたいだけだろ?階層構造にこだわらくてよいのだ.通常のDockerを起動するために,ソケットを渡せばよいのだ.(拙訳:みー)
dindは扱いにくいと感じていましたので,Docker outside of Docker (dood) を調べてみました.doodは,Docker socket bindingとも呼ばれるようで,GitLab CIで使用する際には以下のドキュメントに詳しく記載されています.
Building Docker images with GitLab CI/CD | GitLab
config.toml
volumesで/var/run/docker.sock:/var/run/docker.sockを指定するのがポイントです.
concurrent = 4
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
url = "https://gitlab.com"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
Insecure = false
[runners.docker]
tls_verify = false
image = "docker:19.03.1"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
shm_size = 0
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
pull_policy = "if-not-present"
.gitlab-ci.yml
imageをdocker:stableにすれば,dockerコマンドが使用できます.
docker-composeをインストールするには,依存するライブラリを先にインストールしてから,pipを用いてインストールするのがよいみたいです.*1
example:
image: docker:stable
before_script:
- apk add --no-cache python3-dev libffi-dev openssl-dev gcc libc-dev make
- mkdir -p .pip
- pip3 --cache-dir=.pip install docker-compose
cache:
paths:
- .pip
これでprivileged を有効にしなくてもdockerが使えるようになり,とても便利です.