docker
docker-compose
alpine

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

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