digdag と Docker outside of Docker(DooD)

2020-12-30

手元で digdag を試す時にそれ自体を docker の中に入れていて、さらにタスクをコンテナで実行したいと思って調べたことをメモ

サンプルのリポジトリはgithubにおきました

digdag 本体の dockerize

  • envsubst で docker-compose 側の環境変数を動的に digdag にも与える
  • これをファイルに書いたものを bin/ などに配置して command として起動する
envsubst < digdag/server.properties.template > digdag/server.properties
java -jar /usr/local/bin/digdag server -c digdag/server.properties
  • docker-compose.yml でコンテナの中からホスト側の docker.sock を見られるように volumes を設定する
# docker-compose.yml
version: '3'
services:
  digdag_server:
    build:
      context: .
      dockerfile: docker/Dockerfile
    ports:
      - "65432:65432"
    depends_on:
      - postgres
    environment:
      POSTGRES_HOST: postgres
      POSTGRES_DB: digdag_db
      POSTGRES_USER: digdag
      POSTGRES_PASSWORD: digdag
    volumes:
      - .:/src
      - /var/run/docker.sock:/var/run/docker.sock
    command: /bin/sh bin/digdag
  postgres:
    image: postgres:13.1-alpine
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: digdag_db
      POSTGRES_USER: digdag
      POSTGRES_PASSWORD: digdag

workflow の実行

準備ができたら適当な .dig ファイルを用意して実行してみる。 今回はテストなのでGUIで作る

+docker_pull:
  sh>: docker pull ruby:2.7-alpine

+docker_run:
  sh>: docker run -i --rm ruby:2.7-alpine ruby -e 'puts "hey"'

GUIから workflow をRUNすると docker image の pull が走って、 hey と表示されるはず

参考