みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

dindからdoodへ

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