docker-composeで単一のコンテナーを再起動する方法


333

docker-compose.yml4つのコンテナーを含むファイルがあります:redis、postgres、api、worker

workerの開発中、変更を適用するために再起動が必要になることがよくあります。worker他のコンテナーを再起動せずにコンテナー(例:)を再起動する良い方法はありますか?


2
docker-compose -f docker-compose.yml再起動ワーカー
Jinna Balu 2018年

回答:


398

非常に簡単です。次のコマンドを使用します。

docker-compose restart worker

コンテナーを強制終了する前に停止を待機する時間を設定できます(秒単位)

docker-compose restart -t 30 worker

これはコンテナを再起動しますが、再構築しないことに注意してください。変更を適用してから再起動する場合は、他の回答を確認してください。


3
私にとってはうまくいきましたが、ここで許可されている場合の一般的な質問:「再起動」はリンクされたコンテナを処理して/ etc / hostsを更新しますか、または「再起動」はIPをまったく変更しませんか?
michabbb 2016年

コンテナーは名前でリンクされており、通常、心配する必要がある唯一のIPは外部DockerホストIP(通常は192.168.99.100)です。問題が発生する可能性があるのは、たとえば、他のコンテナが接続されているデータベースコンテナを再起動した場合です。依存するコンテナは、再接続するのに十分な復元力が必要です。
Ryan Kimber

20
OPは、「変更を適用するために再起動する」必要があると述べています。ドキュメントによると、docker-compose restartコマンドは変更を適用しません。「docker-compose.yml構成を変更した場合、これらの変更はこのコマンドの実行後に反映されません。」したがって、を使用してくださいdocker-compose up -d --builddocs.docker.com/compose/reference/restart
featherbelly

5
nb、workerは、yamlファイルでサービスに付けられた名前であり、実行時に表示されるものではありませんdocker ps -a
worc

2
この他の答えははるかに優れてstackoverflow.com/a/39501539/292408として、restartすでに走った場合でも、変更を適用しないdocker-compose build <container name>と、これは非稼働/不正解です。
Elijah Lynn

170

単一ノードの再起動に対する他の回答は、ターゲットですdocker-compose restart worker。コンテナをバウンスしますが、個別に再構築した場合でも変更は含まれません。手動ですることができstoprmcreate、とstart、しかし、はるかに簡単な方法があります。

コードを更新した場合は、次のコマンドを使用して、ビルドとリロードを1ステップで実行できます。

docker-compose up --detach --build

最初に、変更されたコードから画像を再構築します。キャッシュが再利用されているため、変更がない場合は高速です。そして、変更されたコンテナのみを置き換えます。ダウンロードしたイメージが古くなっている場合は、上記のコマンドの前に次のコマンドを実行できます。

docker-compose pull

最初に変更されたイメージをダウンロードするには(up上記のようなコマンドを実行するまでコンテナーは再起動されません)。初期停止は不要です。

そして、これを単一のサービスに対してのみ行うには、指定したいサービスでupまたはpullコマンドを実行します。例:

docker-compose up --detach --build worker

最初のオプションの簡単な例を次に示します。Dockerfileは、コードの頻繁に変更される部分を最後近くに保つように構造化されています。実際、pip installファイルはほとんど変更されないため、要件は個別に取得されます。また、nginxコンテナとredisコンテナは最新であるため、再起動されませんでした。プロセス全体の合計時間は6秒未満でした。

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

これは興味深いですが、-no-cacheオプションと一緒に使用できますか?私に何かを追加し、package.json再作成する必要RUN npm installがあるが、Dockerfileそれ自体は変更されていないとし
ましょう

2
@augustinriedinger入力ファイルが変更されCOPY、それをコマンドに含めると、自動的にキャッシュが壊れます。
BMitch 2017

1
@augustinriedingerありがとう。私はモバイルなので、リンクされた質問が表示されません。あなたの質問のステップから、あなたはすでにCOPYDockerfileにコマンドを持っているはずです。git pullpackage.jsonファイルを更新し、ドッキングウィンドウを使用すると、別のファイルにコピーし見たときのビルドキャッシュが壊れます。
BMitch 2017

1
感謝はこの行動について知りませんでした!私はADD代わりに使用していましたがCOPY、明らかに後者がベストプラクティスなので、私はそれを採用します!
オーガスティンリーディンガー2017

1
@augustinriedinger ADDCOPYキャッシュバストの場合と同じ結果になりますが、(ベストプラクティスのリンクで提案されているように)ほとんどは追加の機能を必要としないため、言及することすらしません。
BMitch 2017

28

ここで変更を加えてサービスを再開するには、次の手順を実行しました。

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
ビルドで適用する変更が必要な場合は、簡単に行うことができ、docker-compose up -d --buildすべてを再ビルドして、変更されたコンテナーを再起動します。最初に停止してダウンタイムを必要とせず、作成と開始のコマンドを個別に行う必要もありません。
BMitch

4
はい、すべてのサービスを再起動したいが、OPは単一のサービスのみを再起動し、他のサービスは再起動しない場合
Jeff

3
私が投稿した回答を参照してください。例では、up変更されたため再起動が必要なコンテナのみが再作成されます。
BMitch

18

次のコマンド

docker-compose restart worker

コンテナを停止して開始するだけです。つまり、docker-compose.xmlから変更をロードせずに

STOPはPCの休止状態に似ています。したがって、停止/開始は、構成ファイルで行われた変更を検索しません。コンテナーのレシピ(docker-compose.xml)からリロードするには、コンテナーを削除して作成する必要があります(PCの再起動と同様)

したがって、コマンドは次のようになります

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

+1、どうもありがとう!以下のためrmのラインオプションが-f便利(プロンプトなし)として、現在のドッキングウィンドウが来るcreatestartマージされるup(ので、合計で、我々は3つのコマンドではない4を持っている)、およびのためupのオプション-d(実行はバックグラウンドで動作している)に有用です。
astrowalker

10

docker-composeファイルでサービスを再起動します

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

ユースケース#1: COMPOSE_FILE_NAMEがdocker-compose.ymlサービスでワーカーの場合

docker-compose restart worker

ユースケース#2:ファイル名がでsample.yml、サービスがworkerの場合

docker-compose -f sample.yml restart worker

デフォルトでは、docker-composeはコマンドdocker-compose.ymlを実行するかどうかを探しますdocker-compose。それ以外の場合は、特定のファイル名を指定するフラグがあります。-f [FILE_NAME].yml


7

単純な「ドッカー」コマンドは「ワーカー」コンテナについて何も知りません。このようなコマンドを使用する

docker-compose -f docker-compose.yml restart worker


4
機能しません
-coker

3

コンテナを再起動します

コンテナーを再起動するだけの場合:

docker-compose restart servicename

このコマンドは、「名前でコンテナを再起動するだけ」と考えてください。これは、 docker restart。コマンドです。

注意点:

  1. ENV変数を変更した場合、それらはコンテナで更新されません。あなたはそれを止めて、もう一度始める必要があります。または、単一のコマンドdocker-compose upを使用して変更を検出し、コンテナを再作成します。

  2. 他の多くの人が述べたように、docker-compose.ymlファイル自体を変更した場合、単純な再起動はそれらの変更を適用しません。

  3. ビルド段階で(Dockerfileusing ADDまたはCOPYコマンドで)コンテナー内のコードをコピーする場合、コードが変更されるたびにコンテナーを再ビルドする必要があります(docker-compose build)。

コードとの相関

docker-compose restartあなたのコードが次のdocker-compose.ymlようにボリュームディレクティブによってコンテナにマップされたパスを取得する場合、完全にうまく機能するはずです:

services:

  servicename:
    volumes:
      - .:/code

ただし、ライブコードの再読み込みを使用することをお勧めします。これは、おそらく選択したフレームワークによってDEBUGモードで提供されます(または、選択した言語で自動再読み込みパッケージを検索できます)。これを追加することで、コードが変更された後に毎回コンテナーを再起動する必要がなくなり、代わりにプロセスを内部で再ロードします。


1

ここでの答えは、docker-compose.ymlファイルでの変更の反映について話しています。

しかし、コードに加えた変更を組み込みたい場合はどうすればよいですか。これは、イメージを再構築することによってのみ可能であり、次のコマンドで行うと信じています。

1. Dockerコンテナーの停止

docker stop container-id

2. Dockerコンテナーの削除

docker rm container-id

3. Dockerイメージの削除

docker rmi image-id

4.コンテナを再度作成します

docker-compose up container-name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.