SystemdによるDockerコンテナの自動起動
コンテナのユニットを起動する前に、docker サービスを先に起動する必要があります。
この起動順序を制御するには、[Unit]
セクションに After=docker.service
と Requires=docker.service
を追加します。
[Unit]
Description=Celery worker container
After=docker.service
Requires=docker.service
[Service]
セクションの ExecStart
ディレクティブにサービス起動時に実行するコマンドを指定します。
ExecStartPre
と ExecStartPost
には、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