🥺

docker-composeで作成したコンテナから元のYAMLファイルを見つける方法

2025/03/14に公開2

docker-composeで作成したコンテナから元のYAMLファイルを見つける方法

こんにちは!今回は、docker-composeで複数のコンテナを立ち上げた後、「どのYAMLファイルから作られたコンテナなのか分からなくなった...」という状況の対処法をご紹介します。

問題: コンテナ乱立でどのYAMLから作られたか分からない

複数のプロジェクトでdocker-composeを使用していると、いつの間にかたくさんのコンテナが起動していて、「このコンテナはどのdocker-compose.ymlから作成されたんだっけ?」と悩むことはありませんか?

特に以下のような状況で混乱しがちです:

  • 複数のプロジェクトを同時に開発している
  • チームメンバーが作成したコンテナが残っている
  • テスト環境と本番環境の設定を切り替えている

解決策: ラベル情報を活用する

実は、docker-composeで作成されたコンテナには、元になった設定ファイルのパスがラベルとして記録されています!このラベル情報を活用すれば、どのYAMLファイルから作成されたのか簡単に特定できます。

コマンド一発で元のYAMLファイルを特定する

以下のコマンドを実行するだけで、各コンテナと対応するdocker-compose.ymlファイルのパスが表示されます:

$ docker container ls --format "{{.Names}} {{.Labels}}" | sed -E 's/^([^ ]+) .*com.docker.compose.project.config_files=([^,]+).*/\1 \2/'

実行例

web-app-apache-1 /home/user/projects/webapp/docker-compose.yml
api-service /home/user/projects/webapp/docker-compose.yml
api-db /home/user/projects/webapp/docker-compose.yml

コマンドの解説

このコマンドは2つの部分から成り立っています:

  1. docker container ls --format "{{.Names}} {{.Labels}}"

    • コンテナ名とすべてのラベル情報を取得します
  2. sed -E 's/^([^ ]+) .*com.docker.compose.project.config_files=([^,]+).*/\1 \2/'

    • 正規表現を使って、コンテナ名と設定ファイルのパスだけを抽出します
    • com.docker.compose.project.config_filesというラベルに元のYAMLファイルパスが格納されています

応用: 特定のコンテナだけを絞り込む

特定のコンテナについてだけ知りたい場合は、grepで絞り込むこともできます:

$ docker container ls --format "{{.Names}} {{.Labels}}" | sed -E 's/^([^ ]+) .*com.docker.compose.project.config_files=([^,]+).*/\1 \2/' | grep api
api-service /home/user/projects/webapp/docker-compose.yml
api-db /home/user/projects/webapp/docker-compose.yml

まとめ

  • docker-composeで作成したコンテナは、元のYAMLファイルのパス情報をラベルとして保持しています
  • 上記のコマンドを使えば、どのコンテナがどのYAMLファイルから作成されたかを簡単に特定できます
  • これで「このコンテナ、どこから作ったっけ?」という悩みから解放されますね!

開発効率化のためのちょっとしたテクニックでしたが、お役に立てば幸いです。

参考

Discussion

paihupaihu
docker container ls --format '{{.Names}} {{range $label := split .Labels ","}}{{$labelkv :=  split $label "=" }}{{if eq (index $labelkv 0) "com.docker.compose.project.config_files" }}{{index $labelkv 1 }}{{end}}{{end}}'

こういうtemplateを駆使する方法もあります

hide5stmhide5stm

このほうが格好がいいですね。ありがとうございます!