Docker Composeでrestart: always
になっているコンテナを、ローカル開発環境だけ自動起動しないようにします。
環境
$ docker --version
Docker version 27.3.1, build ce12230
$ docker compose version
Docker Compose version v2.29.7
結論
こんな感じで、compose.yaml
と同じプロジェクトルートにcompose.override.yaml
を配置しておけばOK
$ docker run --rm --volume $(pwd):/app --workdir /app ruby:slim ruby -e "require 'yaml';puts YAML.dump(Hash[{ 'services' => Psych.load_file('compose.yaml', aliases: true)['services'].keys.map{|k| [k, {'restart'=> 'no'}]}.to_h }])" > compose.override.yaml
読み込むファイル名compose.yaml
と出力先compose.override.yaml
の部分は適当に修正してください。
必要に応じて、compose.override.yaml
は.gitignore
に含めておくのが良いと思います。
説明
Docker Composeの機能としてcompose.override.yaml
という名前のファイルを作成しておくと、このファイルで設定を上書きするというものがあります。
参考: Merge | Docker Docs
services:
web:
restart: 'no'
app:
restart: 'no'
db:
restart: 'no'
このようなyamlファイルを作成すればOKなわけです。
以下のようなRubyプログラムで、サービス一覧を出してrestart: no
を付与するyamlを出力しています。
Rubyを選択したのは標準ライブラリでYAMLをパースできるからです。
require 'yaml'
puts YAML.dump(
Hash[{ 'services' =>
Psych.load_file('compose.yaml', aliases: true)['services'].keys.map{|k|
[k, {'restart'=> 'no'}]
}.to_h }
]
)
これをワンライナーにして、docker run
で実行できるようにしたのが冒頭のコマンドです。
danny-avila/LibreChatやlanggenius/difyのような、本番環境でもDocker Composeを使って起動することが想定されているソフトウェアをローカル環境で動かしたい時に、このような設定ファイルを置いておくと自動起動せずに済みます。
参考