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が使えるようになり,とても便利です.