Edited at

docker-compose で作ったサービス用の /etc/init.d スクリプト

More than 1 year has passed since last update.

docker-compose で1サービスを構築した際に自動起動&自動終了の為に度々必要になるのでメモ。


chkconfig (CentOS6, Amazon Linux)

※ /etc/init.d/docker のrun-levelが "chkconfig: 2345 95 05" なので、Docker起動以降に実行される様修正



  • workspace= は docker-compose プロジェクト (docker-compose.yml のあるディレクトリ) を指します


  • cmdpath= は docker-compose コマンドへのパスです。 pip でインストールした場合はこうなります


  • your-service-name は適切なサービス名に書き換えます

#!/bin/sh

#
# chkconfig: 2345 96 04
# description: start your-service-name containers.
# author: Yusuke Kawatsu

workspace="/usr/local/your-service-name"
cmdpath="/usr/local/bin/docker-compose"
prog="your-service-name"
lockfile="/var/lock/subsys/your-service-name"
pidfile="/var/run/your-service-name.pid"
PATH="$PATH:/usr/local/bin"

start() {
[ -x $cmdpath ] || exit 5
echo -n $"Starting $prog: "

cd $workspace
$cmdpath up -d
retval=$?
pid=$!
echo
[ $retval -eq 0 ] && touch $lockfile && echo $pid > $pidfile

return $retval
}

stop() {
[ -x $cmdpath ] || exit 5
echo -n $"Stopping $prog: "

cd $workspace
$cmdpath down
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile && rm -f $pidfile

return $retval
}

restart() {
stop
sleep 3
start
}

case "$1" in
start)
$1
;;
stop)
$1
;;
restart)
$1
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac


OpenRC (Alpine Linux)

#!/sbin/openrc-run

#
# author: Yusuke Kawatsu

workspace="/usr/local/your-service-name"
cmdpath="/usr/local/bin/docker-compose"
prog="your-service-name"
lockfile="/var/lock/subsys/your-service-name"
pidfile="/var/run/your-service-name.pid"
PATH="$PATH:/usr/local/bin"

start() {
[ -x $cmdpath ] || exit 5
echo -n $"Starting $prog: "

cd $workspace
$cmdpath up -d
retval=$?
pid=$!
echo
[ $retval -eq 0 ] && touch $lockfile && echo $pid > $pidfile

return $retval
}

stop() {
[ -x $cmdpath ] || exit 5
echo -n $"Stopping $prog: "

cd $workspace
$cmdpath down
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile && rm -f $pidfile

return $retval
}

restart() {
stop
sleep 3
start
}

depend() {
need docker
}


systemd (CentOS7)

※2017/07/26 systemd版が必要になったので追記

↓で一応動くのですが Type=simple だと課題がありまして、 systemctl start your-service-name でサービス (docker-compose) が起動した瞬間に戻って来るので、コンテナの一つが起動に失敗していても、サービスとしては起動成功とみなされてしまいます。

うまい方法を何方か教えて下さい。

m(_ _)m

[Unit]

Description=Dockerized Your Service
After=docker.service
BindsTo=docker.service
Conflicts=shutdown.target reboot.target halt.target

[Service]
Type=simple
Environment=APP='your-service-name'
TimeoutStartSec=0
TimeoutStopSec=60
Restart=always
RestartSec=10

WorkingDirectory=/usr/local/your-service-name/
ExecStart=/usr/bin/docker-compose -f docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f docker-compose.yml down

NotifyAccess=all

[Install]
WantedBy=multi-user.target