cron
docker
gcp
container-optimized-os

cronの使えないContainer-Optimized OSでスケジュールジョブを実行する

GoogleCloudPlatformで利用できるコンテナ実行向け軽量OSであるContainer-Optimized OSは,すべてのプログラムをdockerコンテナで実行させることを前提に設計されており,aptやyumなどのパッケージ管理システムを意図的に持っていない.そのため,cronなどのスケジュールジョブを実行させたければ,cron自体をdockerコンテナとして動かす必要があるが,コンテナの中で実行されるため,ホスト側にアクセスすることが容易ではない.

コンテナを定期的に再起動しながら運用したい時はあるので困っていたところ,以下の方法で実現できた.

docker-compose.tasker.yaml
version: "2"

services:
  tasker:
    image: strm/tasker:1.0.1
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    environment:
      configuration: |
        schedule:
          - every: 2 hours
            task: restart-something
        tasks:
          docker:
            - name: restart-something
              image: docker/compose:1.13.0
              volumes:
                - "/var/run/docker.sock:/var/run/docker.sock"
                - "/home/someuser/somedir/:/code/somedir"
              script:
                - cd /code/somedir/
                - docker-compose up -d --force-recreate something

https://github.com/opsxcq/tasker というdockerイメージを使用して,そのdockerコンテナ内でdocker-composeコンテナを実行している.ホストの/var/run/docker.sockをマウントすることでコンテナ内でdockerやdocker-composeを実行してもホストのdockerプロセスに命令を出すことができているというわけだ.

補足

configuration内でvolumeマウントしている- "/home/someuser/somedir/:/code/somedir" この部分は

script:
  - cd /code/somedir/
  - docker-compose up -d --force-recreate something

と対応している.この例は,/home/someuser/somedirに実行したいプログラムとdocker-compose.yamlファイルがある想定で書いている.