LoginSignup
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-21

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4