Composeなしで起動したコンテナのためにComposeファイルを作成する

私は何年もコマンドラインから手動でコンテナを作成してきましたが、今後はcomposeファイルを使いたいと考えています。正しいcompose yamlファイルを作成する最も簡単な方法は何ですか?
docker inspect <container ID>を使って出力を編集できると聞いたことがありますが、その出力は非常に長いファイルになります。
普段使っているコマンドラインの内容からcomposeファイルを作成して、あとの設定はシステムがinspect出力に出てくるような構成を自動的に補完してくれる、といった方法はありますか?

私はアプリケーションをセットアップするとき、すべてをContainer Station内で作成しています…

こんにちは @beneix

ご指摘の通り、docker inspect の出力は冗長すぎて、そのまま変換するのは難しいです — 多くは実行時の状態やイメージのデフォルト値であり、composeファイルには不要です。完全なJSONを編集する代わりに、composeファイルで必要な項目だけを --format で抽出することをおすすめします:

C=<container_name>

docker inspect -f '{{.Config.Image}}' $C
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' $C
docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' $C
docker inspect -f '{{range $p,$b := .NetworkSettings.Ports}}{{if $b}}{{(index $b 0).HostPort}}:{{$p}}{{println}}{{end}}{{end}}' $C
docker inspect -f '{{range .Mounts}}{{.Source}}:{{.Destination}}{{if not .RW}}:ro{{end}}{{println}}{{end}}' $C
docker inspect -f '{{range $n,$_ := .NetworkSettings.Networks}}{{println $n}}{{end}}' $C

これらはcomposeファイルの image:, restart:, environment:, ports:, volumes:, networks: セクションに直接対応しています:

services:
  myapp:
    image: <コマンド1の結果>
    container_name: myapp
    restart: <コマンド2の結果>
    environment:
      - VAR=value        # コマンド3の結果
    ports:
      - "8080:80"        # コマンド4の結果
    volumes:
      - /share/Container/myapp:/config   # コマンド5の結果

ファイルをきれいに保つコツ:

  1. 環境変数:コマンド3はすべての環境変数を表示します(イメージのデフォルト値も含む)。自分で設定したものだけをコピーしてください。イメージのデフォルトは docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' <image> で確認でき、両方に現れるものはスキップしましょう。

  2. command/entrypoint:コンテナ作成時に上書きしていない場合は、command: や entrypoint: を追加する必要はありません。docker inspect で長い起動コマンドが表示されても、ほとんどはイメージのデフォルト — 省略してもイメージ側が処理してくれます。

  3. docker CLIがSSH経由でPATHに無い場合は以下で探せます:

    export PATH="$PATH:$(getcfg container-station Install_Path -f /etc/config/qpkg.conf)/bin"
    
  4. デプロイ前に docker compose config で結果を検証し、新しい名前で立ち上げて、元のコンテナと比較した後に削除してください。

元の docker run コマンドが残っているとのことですが、これは理想的なソースです。composeファイルは、ほぼこれらのフラグをYAMLで表現したものなので(-p → ports, -v → volumes, -e → environment, --restart → restart)、自作のコマンドから変換したほうが、実行中コンテナから逆算するより「きれい」なファイルになります。

今後はContainer Stationで直接composeファイルとしてアプリケーションを作成することもできます(Applications → Create)。検証機能付きのYAMLエディタがあるので、NA9Dの説明通り便利です。