Systemdで制御したいdocker-composeプロジェクトがあります。新興企業では、次のようなスクリプトを使用します。
description "Start/Stop server"
author "Jim Cortez"
start on filesystem and started docker
stop on runlevel [!2345]
respawn limit 3 240
pre-start script
# wait (if necessary) for our docker context to be accessible
while [ ! -f /projects/my_server/docker-compose.yml ]
do
sleep 1
done
/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
end script
script
sleepWhileAppIsUp(){
while docker ps | grep "$1" >/dev/null; do
sleep 2
done
}
sleepWhileAppIsUp "my_server"
end script
# stop docker container after the stop event has completed
post-stop script
if docker ps | grep my_server;
then
/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop
fi
end script
(上記は here から変更)
ただし、私は現在、systemdに切り替えられたUbuntu 15.04を実行するdocker Hostで実行しています。上記をsystemdサービススクリプトとして実行するにはどうすればよいですか? docker-composeデーモンを起動するだけでは、障害が発生した場合にsystemdが追跡して再起動することはできません。
ここに私がこれまでに持っているものがあります:
[Unit]
Description=My Server container
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop
[Install]
WantedBy=local.target
-d
オプションを削除することをお勧めします。この場合、コンテナーをバックグラウンドで実行する必要はありません。
私はそれを見つけました:著者はあなたと同様のアプローチを使用します http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ 。しかし、彼はさらに、各docker-composeサービスに対して1つのsystemdサービスを作成します。
Docker-composeファイルを複数のsystemdサービスファイルに変換してdocker-composeの依存関係を解消することを検討してください: http://container-transform.readthedocs.org/ 私はそのアプローチを使用しました簡単な設定で問題なく動作します。
これを試してみてください。テストで見つかりました。起動または停止するには、通常のサービスよりも時間がかかります。
[Unit]
Description=My Server container
Requires=docker.service
After=network.target docker.service
[Service]
#Restart=always
Type=simple
WorkingDirectory=/projects/my_server
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml down
[Install]
WantedBy=multi-user.target