Dockerで新たにコンテナを起動した時に「WARNING: Found orphan containers (コンテナ名) for this project.」という警告が表示されることがある。
特に、別のプロジェクトで使っている、docker-compose.ymlを他のディレクトリにコピーしてそのまま使ったり、少しだけ中身を変えて使い回すときに発生しがち。
この、orphan containersとは何か?と対処法について。
orphan containersとは?
orphan containersとは、過去に起動したコンテナで、今回のdocker compose up によって、依存関係が切られ孤立したコンテナのこと。(ちなみに、orphanとは孤児という意味。)
削除してもこれから起動するコンテンには影響は出ない。
発生状況とエラーの例
この警告が発生するのは、新たにコンテナを起動したときに、既に作成済みのサービス名を指定すると発生する。
WARNING: Found orphan containers (wp_mysql, phpmyadmin, wp) for this project. If you removed or renamed this service in your compose file, you can run this command with the –remove-orphans flag to clean it up.
このため、この警告は、docker-compose.ymlを使いまわして、サービス名やコンテナ名を変えた場合に発生しやすい。
過去のコンテナの依存性は断ち切られ、新しいコンテナが優先された状況。Dockerが親切に孤立したコンテナがあることを教えてくれている。
orphan containersを削除する方法
orphan containersが本当に要らないものであれば、--remove-orphans
オプションで削除する。
まだ使うコンテナの場合は、一度、新しく起動したコンテナとイメージを削除し、起動しようとしているdocker-compose.ymlを編集し直して、再度起動することで、依存関係のないコンテナを作ることができる。
過去のコンテナを削除
コマンド実行後のコメントにも記載されている、--remove-orphans
オプションをつけて「docker compose up」を実行すれば、過去の孤立したコンテナを自動で削除してくれる。
docker-compose up --remove-orphans
コンテナを作り直す
過去のコンテナをそのまま残したい場合は、docker-compose.ymlを編集して、過去のコンテナと関係性のないコンテナを作り直します。
まずは、一度起動してしまった不要なコンテナとイメージを削除します。
コンテナの削除手順
起動中のコンテナを停止します。
#起動中のコンテナ一覧を表示
docker ps
#コンテナの停止
docker stop <コンテナ名>
コンテナを指定して削除します。
#すべてのコンテナ一覧を表示
docker ps -a
#コンテナを削除
docker rm <コンテナ名>
イメージの削除手順
イメージを指定して削除をします。
#イメージ一覧を表示
docker images
#イメージを削除
docker rmi <イメージ名>
docker-compose.ymlを修正
docker-compose.ymlで修正するのは次の項目です。
サービス名を変更しないと、既存のdockerイメージを使って構築するため、コンテナ内の中身がバインドされません。
サービス名を変更したときに、depends_onやlinksも合わせて変更しないと、起動するサービスがないというエラーが発生します。
コンテナ名を変更しないと、コンテナが重複して起動できません。
ポート番号を変更しないとポートが重複してページが開けません。
Dockerfileでコンテナ内のディレクトリ名を変更した場合は、バインドするコンテナ内のディレクトリ名も合わせて変更する必要があります。
docker-compose.ymlの変更例
version: '3'
services:
db:
image: postgres
container_name: rails-vue-db
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_HOST_AUTH_METHOD: 'trust'
web:
build: .
container_name: rails-vue-web
command: bash -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/rails-vue
ports:
- "3000:3000"
depends_on:
- db
↓例えば、次のように変更します。
version: '3'
services:
aa-db: #変更
image: postgres
container_name: rails-aa-db #変更
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_HOST_AUTH_METHOD: 'trust'
aa-web: #変更
build: .
container_name: rails-aa-web #変更
command: bash -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/rails-aa #変更(Dockerfileのディレクトリを変更した場合)
ports:
- "3001:3000" #変更
depends_on:
- aa-db #変更
変更を保存した後に、docker-compose up
を実行すれば、前のコンテナとは関係性を持たないコンテナを生成することができます。
なお、volumesで、バインドするコンテナ内のディレクトリ名を変更する場合は、Dockerfileの内容も変更する必要があります。
詳しい方法については以下をご参考ください。
【Docker】docker-composeファイルを使い回す時の注意点(コンテナ起動エラーやファイルがローカルにコピーされない時の対処法)