SystemdによるDockerコンテナの自動起動

コンテナのユニットを起動する前に、docker サービスを先に起動する必要があります。

この起動順序を制御するには、[Unit] セクションに After=docker.serviceRequires=docker.service を追加します。

[Unit]
Description=Celery worker container
After=docker.service
Requires=docker.service

[Service] セクションの ExecStart ディレクティブにサービス起動時に実行するコマンドを指定します。

ExecStartPreExecStartPost には、ExecStart のコマンド前後に実行するコマンドを指定します。

以下のシェルスクリプトは、作成したユニットファイルを /etc/systemd/system/ に配置し、ユニットの自動起動を有効にするものです。

systemctl list-unit-files コマンドはユニットファイルの一覧を確認できます。

create_unit_file() {
    FILE="celery_worker_container.service"
cat > $FILE << EOF
[Unit]
Description=Celery worker container
After=docker.service
Requires=docker.service

[Service]
ExecStartPre=/usr/bin/docker start celery_worker
ExecStart=/usr/bin/docker exec -d celery_worker bash -c "<command>"
TimeoutStopSec=0
RestartSec=5
Restart=on-failure

[Install]
WantedBy=default.target
EOF
    sudo mv $PWD/$FILE /etc/systemd/system/celery_worker_container.service
}

start_service() {
    # 既存の自動起動が有効になっているユニットをチェックする
    if [ ! "$(systemctl list-unit-files --state=enabled | grep 'celery')" ]; then
        create_unit_file
        sudo systemctl start celery_worker_container
        sudo systemctl enable celery_worker_container
    fi
}

start_service