システムの起動時にdocker-compose up -dを実行する方法は?


114

コンテナーを起動ポイントで自動起動させるために、次のコマンドを追加しようとしました。

cd directory_has_docker-compose.yml && docker-compose up -d /etc/rc.local内。

しかし、マシンを再起動すると、コンテナが機能しなくなります。

docker-compose up -dシステム起動時にどのように実行しますか?


3
使用--restart alwaysまたは--restart unless-stoppedまたはドッキングウィンドウ-compose.yml使用中のrestart: always- > のRef。ただし、一部のコンテナでは機能しない可能性があります。
Benyamin Jafari

回答:


129

crontabまたは廃止された/etc/rc.localファイルを使用する場合はsleep 10、システムサービスが利用可能であることを確認するために、遅延(マシンによっては例)が必要です。通常systemd(またはupstart)は、システムの起動時に開始するサービスを管理するために使用されます。これには同様の設定を使用してみてください:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

または、-dフラグなしで実行したい場合:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

WorkingDirectoryDocker化されたプロジェクトパスでパラメーターを変更します。そして、サービスを自動的に開始できるようにします。

systemctl enable docker-compose-app

ラズベリーを再起動せずに機能するかどうかをテストする簡単な方法はありますか?
dmigo

2
これは最もエレガントな答えですIMO
kuzyn

2
@dmigo systemctl start docker-compose-appsystemctl status docker-compose-app私は考えてあなたが探しているものです。
HectorJ 2018年

systemctl start docker-compose-appがこれに遭遇したとき、私にとってはうまくいきませんでした:Job for docker-compose-app.service failed because the control process exited with error code. See "systemctl status docker-compose-app.service" and "journalctl -xe" for details
Benyamin Jafari

1
@dmigo:次の条件でサービスの起動をテストします:service docker-compose-app start、ステータスはservice docker-compose-app status、ストップ:service docker-compose-app stop
BarryPye

96

追加できるはずです:

restart: always 

docker-compose.ymlファイルで再起動するすべてのサービスに


6
再起動の際に実行する必要があるため、再起動する前に手動で停止しないでください。
トム

Nginxなどの一部のサービスは、このオプションでも起動しません。
Benyamin Jafari

15
これが質問に対する正しい答えです。コンテナーを再起動するための設計された方法があります。なぜcronジョブやその他の方法でホイールを再発明するのかです。
Taha Rehman Siddiqui

これが正解です。cronの代わりにKubernetesの使用を開始すると、それを使用して満足するでしょう。
pferrel

9
@TahaRehmanSiddiqui restart: alwaysいくつかの重大なバグがあることに注意してください。たとえば、ホストのマウントは再起動時にアタッチされません。私の意見では、既存のホイールが正方形の場合は、ホイールを再発明する方が良いです。
okdewit

73

docker.serviceシステムの起動時に有効になっている場合

$ sudo systemctl enable docker

あなたのサービスdocker-compose.yml

restart: always

以下のコマンドを1回だけ実行すると、システムを再起動したときにすべてのサービスが実行されます

docker-compose up -d

2
これは最もエレガントなソリューションになるはずです
カールチャン

34

私が試したところrestart: always、それはいくつかのコンテナ(php-fpmなど)で動作しますが、一部のコンテナ(nginxなど)が再起動後にまだ再起動しないという問題に直面しました。

問題を解決しました。

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&

2
なぜこの回答に反対票を投じるのですか?答えは役に立ちませんか?何かの意味で間違っていますか?コメントは、回答者や他の人に何が悪いのかを知らせるのに役立ちます。
アユシャ2017

5
彼らは非決定論的振る舞いを導入として、あなたは裸のスリープのsuspicuousする必要があります:martinfowler.com/articles/...
giorgiosironi

この場合、@ giorgiosironiの睡眠は問題ありません。コンテナーの起動は、とにかく非決定的な動作を処理できる必要があります。
z0r

4
また、不要になる可能性のある最大30秒のレイテンシが発生します。
giorgiosironi

@ z0r睡眠は良くありません!スリープは「機能する」可能性がありますが、起動シーケンスは確定的でなければなりません。Linuxサービスは、依存関係を使用して、開始する前にネットワークなどが利用可能であることを確認します。同じことをする必要があります。
colm.anseo

25

常に docker composeファイルでrestart:を使用します。

Docker-compose up -d画像からコンテナを再度起動します。docker-compose start停止したコンテナーを開始するために使用します。イメージから新しいコンテナーを起動することはありません。

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

また、他のコンテナの依存関係がある場合は、最初に作成されるようにdockerファイルにコードを書き込むことができます。


1
使いたくalwaysないかもしれませんが、たぶんunless-stopped。その他のオプションはon-failureおよびnoです。これは再起動ポリシーと呼ばれます。
ポール、

5

user39544の回答への追加として、もう1つのタイプの構文crontab -e

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d

これは、Raspianを実行するRPi3で2018年3月に私のために働きました。私はcrontab -eユーザーpiとして実行し、piはグループ
Scott Veirs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.