回答:
非常に簡単です。次のコマンドを使用します。
docker-compose restart worker
コンテナーを強制終了する前に停止を待機する時間を設定できます(秒単位)
docker-compose restart -t 30 worker
これはコンテナを再起動しますが、再構築しないことに注意してください。変更を適用してから再起動する場合は、他の回答を確認してください。
docker-compose restart
コマンドは変更を適用しません。「docker-compose.yml
構成を変更した場合、これらの変更はこのコマンドの実行後に反映されません。」したがって、を使用してくださいdocker-compose up -d --build
。 docs.docker.com/compose/reference/restart
docker ps -a
restart
すでに走った場合でも、変更を適用しないdocker-compose build <container name>
と、これは非稼働/不正解です。
単一ノードの再起動に対する他の回答は、ターゲットですdocker-compose restart worker
。コンテナをバウンスしますが、個別に再構築した場合でも変更は含まれません。手動ですることができstop
、rm
、create
、と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
それ自体は変更されていないとし
COPY
、それをコマンドに含めると、自動的にキャッシュが壊れます。
COPY
Dockerfileにコマンドを持っているはずです。git pull
package.jsonファイルを更新し、ドッキングウィンドウを使用すると、別のファイルにコピーし見たときのビルドキャッシュが壊れます。
ADD
はCOPY
キャッシュバストの場合と同じ結果になりますが、(ベストプラクティスのリンクで提案されているように)ほとんどは追加の機能を必要としないため、言及することすらしません。
ここで変更を加えてサービスを再開するには、次の手順を実行しました。
docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
docker-compose up -d --build
すべてを再ビルドして、変更されたコンテナーを再起動します。最初に停止してダウンタイムを必要とせず、作成と開始のコマンドを個別に行う必要もありません。
up
変更されたため再起動が必要なコンテナのみが再作成されます。
次のコマンド
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
rm
のラインオプションが-f
便利(プロンプトなし)として、現在のドッキングウィンドウが来るcreate
とstart
マージされるup
(ので、合計で、我々は3つのコマンドではない4を持っている)、およびのためup
のオプション-d
(実行はバックグラウンドで動作している)に有用です。
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
コンテナーを再起動するだけの場合:
docker-compose restart servicename
このコマンドは、「名前でコンテナを再起動するだけ」と考えてください。これは、 docker restart
。コマンドです。
ENV変数を変更した場合、それらはコンテナで更新されません。あなたはそれを止めて、もう一度始める必要があります。または、単一のコマンドdocker-compose up
を使用して変更を検出し、コンテナを再作成します。
他の多くの人が述べたように、docker-compose.yml
ファイル自体を変更した場合、単純な再起動はそれらの変更を適用しません。
ビルド段階で(Dockerfile
using ADD
またはCOPY
コマンドで)コンテナー内のコードをコピーする場合、コードが変更されるたびにコンテナーを再ビルドする必要があります(docker-compose build
)。
docker-compose restart
あなたのコードが次のdocker-compose.yml
ようにボリュームディレクティブによってコンテナにマップされたパスを取得する場合、完全にうまく機能するはずです:
services:
servicename:
volumes:
- .:/code
ただし、ライブコードの再読み込みを使用することをお勧めします。これは、おそらく選択したフレームワークによってDEBUGモードで提供されます(または、選択した言語で自動再読み込みパッケージを検索できます)。これを追加することで、コードが変更された後に毎回コンテナーを再起動する必要がなくなり、代わりにプロセスを内部で再ロードします。
ここでの答えは、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