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