Accessoryの新規コンテナ実行時にoption_argsを適用

basecamp/kamal

Kamalでアクセサリ(データベースなど)に対してコマンドを実行する際、新規コンテナで実行する場合と既存コンテナで実行する場合でオプション設定が異なる不整合が修正されました。

背景

kamal accessory execコマンドは、--reuseオプションの有無で動作が異なります。--reuseを指定すると既存のコンテナでコマンドを実行し、指定しない場合は新規の一時的なコンテナを起動してコマンドを実行します。

しかし、この新規コンテナ起動時にconfig/deploy.ymloptionsで指定したDockerオプション(ulimit、CPU制限、メモリ制限など)が適用されていませんでした。これにより、既存コンテナと新規コンテナで実行環境が異なるという問題が発生していました。

例えば、以下のような設定でulimitを指定していても:

accessories:
  my-accessory:
    image: my-image
    options:
      ulimit: nofile=8192:8192

新規コンテナでの実行時にはデフォルト値(1024)が使われていました。

技術的な変更

#1739では、execute_in_new_containerメソッドに*option_argsを追加することで、この不整合を解消しています。

変更前:

def execute_in_new_container(*command, interactive: false)
  docker :run,
    "-it", (interactive ? "--rm" : "--rm"),
    *network_args,
    *env_args,
    *volume_args,
    image,
    *command
end

変更後:

def execute_in_new_container(*command, interactive: false)
  docker :run,
    "-it", (interactive ? "--rm" : "--rm"),
    *network_args,
    *env_args,
    *volume_args,
    *option_args,  # 追加
    image,
    *command
end

これにより、実際に生成されるDockerコマンドは以下のように変わります:

変更前:

docker run --rm --network kamal --env MYSQL_ROOT_HOST="%" --env-file .kamal/apps/app/env/accessories/mysql.env private.registry/mysql:8.0 mysql -u root

変更後:

docker run --rm --network kamal --env MYSQL_ROOT_HOST="%" --env-file .kamal/apps/app/env/accessories/mysql.env --cpus "4" --memory "2GB" private.registry/mysql:8.0 mysql -u root

設計判断

この修正は、kamal app execの実装に倣ったものです。アプリケーションコンテナでは既に同様の実装がなされており、新規コンテナ実行時にも設定されたオプションが適用されていました。

アクセサリについても同じ挙動にすることで、一貫性のある実行環境を提供できるようになりました。これは特に、リソース制限やセキュリティ設定など、環境依存の設定が必要な場合に重要です。

テストコードでは、cpusmemoryオプションを持つ設定を追加し、runメソッドとexecute_in_new_containerメソッドの両方で正しくオプションが適用されることを検証しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成の必須要素(Title, Context, Technical Detail)がすべて明確に記載されており、任意要素のDesign Insightも含まれています。ファイル名付きコードブロックやGitHubリンク記法も正しく使用されており、ガイドラインに完全に準拠しています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ⚠ WARNING

技術的な正確性と表現の適切性

Diff情報が提供されていないため、記事内のコード引用と実際の変更との完全な照合はできませんでした。しかし、提示されたコード例やDockerコマンドの例は構文的に正しく、記事の説明とも整合性が取れており、技術的に妥当です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ⚠ WARNING

元のPR情報との一致度

記事の主要な主張はPR Titleと整合しています。ただし、『設計判断』セクションの内容(appの実装に倣った点)やテストコードに関する言及は、提供されたPR Titleだけでは完全な裏付けが取れませんでした。これらは技術的に妥当な推測の範囲内であり、明らかなハルシネーションではありませんが、元情報での確認が望まれます。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除