はじめに
CoreOSをfleet無しで利用していると、起動時に自動的にdockerコンテナを起動してほしくなります。(特に自動アップデートを有効にしている場合)CoreOSではinitやcronの代わりにSystemdを利用していますので、Systemdの書き方と、CoreOS特有の話をメモします。
Systemdの書き方
Systemdでは/etc/systemd/system/以下に、xxxx.serviceと言う名称でファイルを置くとサービスとして認識されます。ファイルの内容は主に[Unit]と[Service]、[Install]の3パートが存在します。
[Unit]は、サービス概要や本サービスに必要なサービスの定義、また本サービスを起動する前に起動するサービスを定義します。
下の内容では、Dockerコンテナを起動するため、必要なサービス(Requires)としてdocker.serviceを指定しています。
また、docker起動後に起動させる必要があるため、After=docker.serviceと言う指定もしています。
なお、RequiresやAfterは複数記載することができます。
[Service]は、実際に起動時や終了時に実行されるコマンドや、プロセス停止時の動作を規定します。
下の内容では、dockercontainer1と言う名称のイメージから、dockercontainer1と言う名称のコンテナを起動させています。
また、起動時に同名のコンテナが存在するとコマンドに失敗するため、起動前のコマンド(ExecStartPre)としてコンテナの停止と削除コマンドを入れています。
なお、コンテナが存在しない場合、コンテナの停止と削除コマンドは失敗するため、失敗しても起動を進めることができるようにするために、コマンドの前に"-"と記載されています。
また、下の内容ではdocker runを利用していますが、docker startで起動することもできます。どちらの場合も、コンテナを作成する時に"-d"オプションをつけないようにしてください。
"-d"オプションをつけるとバックグラウンドで実行されるため、Systemdは起動に失敗したと判断し、サービス再起動のプロセスに入ります。< br/>
[Install]は、サービスを起動する時のRunlevelを定義しています。基本は下のままで問題無いです。
#dockercontainer1.service
[Unit]
Description=dockercontainer1
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStartPre=-/usr/bin/docker stop dockercontainer1
ExecStartPre=-/usr/bin/docker rm -f dockercontainer1
ExecStart=/usr/bin/docker run --rm -v /tmp:/tmp --name dockercontainer1 dockercontainer1
ExecStop=/usr/bin/docker stop dockercontainer1
[Install]
WantedBy=multi-user.target
0 件のコメント :
コメントを投稿