dockerコンテナをサービス化しようと思って、systemdで自動起動するようにsystemdのサービスを書いた。
方法自体は、公式にも書いてある。
Docker Docs Automatically start containers
要約すると、コンテナをdocker run
して作って、そのコンテナをdocker start
、docker stop
するサービスを作ってねという。
じゃあ、docker pull
からしようと思うとどうすんねんというあたりは、以下のブログに、詳しく書かれていた。
Running Docker Containers with Systemd - Container Solutions
試しに、registryを起動するのを以下のとおり作った。
[Unit]
Description=Docker Registry
Documentation=https://github.com/74th/systemd-docker-registry
Requires=docker.service
After=docker.service
[Service]
Type=simple
ExecStartPre=-/usr/bin/docker stop registry
ExecStartPre=-/usr/bin/docker rm registry
ExecStartPre=/usr/bin/docker pull registry
ExecStart=/usr/bin/docker run --name registry -p 5000:5000 library/registry
[Install]
WantedBy=multi-user.target
-
docker.service
が起動後に実行するようにする。After=docker.service
とする。 - サービスの
Type
は、コマンドが動いている間を起動していると判定する、Type=simple
を使う。そのため、コンテナの起動自体は、docker run -d
ではなく、ただのdocker run
で良い。 - 起動時実行時コマンドである、
ExecStart
にdocker run
をやらせる。 - その前に、
docker pull
とか停止とか削除とかをExecStartPre
でやらせる。
このファイルを作成して、以下のとおり有効化する。
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl enable docker-registry
これで再起動させたところ、自動起動されていた。
一つはまったのは、このdocker-registry.service
のファイルをgitで管理しようと、/usr/lib/systemd/system/
内にはシンボリックリンクで格納していた。すると、上記コマンドを入れても、Failed to issue method call: No such file or directory
と言われてしまった。/usr/lib/systemd/system/
内には、実ファイルを置かなければならないらしい。
ワンライナーでできるのを、githubにあげておきました。