Railsアプリケーション用のDockerコンテナを作成する多くの例を見てきました。通常、彼らはRailsサーバーを実行し、migrations/setupを実行してからRailsサーバー。
これらのコンテナを同時に5つ生成する場合、Rails移行を開始しようとする複数のプロセスをどのように処理しますか?Rails一般クエリログの現在のスキーマバージョン(MySQLデータベース):
SELECT `schema_migrations`.`version` FROM `schema_migrations`
しかし、これが異なるRails=インスタンスで同時に発生する場合、競合状態を見ることができます。
DDLはMySQLではトランザクションに対応しておらず、移行(移行ごとのトランザクションを除く)の実行中に一般的なクエリログにロックが発生しないことを考えると、それらを並行して開始するのは悪い考えのように思われます。実際、これを3回ローカルで開始すると、テーブルを作成しようとすると、2つ目のRailsインスタンスがクラッシュします。3番目のRails =インスタンスが移行を正常に完了します。これがデータベースに何かを挿入した移行である場合、非常に安全ではありません。
それから、移行/セットアップを実行する単一のコンテナを実行し、次に複数のRailsワーカーを生成するUnicornインスタンスを生成します)?
N Rails containersと、移行を実行して終了する1つの「移行コンテナ」を生成する必要がありますか?
より良いオプションはありますか?
特にRailsについては経験がありませんが、Dockerとソフトウェアエンジニアリングの観点から見てみましょう。
Dockerチームは、コンテナがアプリケーションの出荷に関するものであることを、時には非常に積極的に支持しています。 これは本当に素晴らしい声明 で、ジェローム・ペタッツォーニは、懸念の分離がすべてだと言います。これが、あなたがすでに理解しているポイントだと思います。
移行またはセットアップを開始するRailsコンテナーを実行すると、初期展開に適している可能性があり、おそらく開発中に必要になる場合があります。
したがって、N Rails containerを実行し、管理タスクを実行するために使用するコンテナをツール/移行/セットアップに追加するために使用する1つのイメージがあると言います。 official Rails image このことについて言う:
スローアウェイコンテナ(ソースコードをマウントし、コンテナを起動してアプリを起動する)として、また他のイメージを構築するベースとして使用するように設計されています。
そのイメージを見るとき、セットアップまたは移行コマンドはありません。使い方はユーザー次第です。したがって、いくつかのコンテナを実行する必要がある場合は先に進んでください。
mysqlの経験から、これはうまく機能します。データのみのコンテナーを実行してデータをホストし、mysqlサーバーでコンテナーを実行し、最後にバックアップや復元などの管理タスク用のコンテナーを実行できます。 3つのコンテナすべてに対して、同じイメージを使用できます。これで、いくつかのWordpressコンテナからデータベースに自由にアクセスできます。これは、懸念事項の明確な分離を意味します。 docker-compose
を使用する場合、これらすべてのコンテナを管理することはそれほど難しくありません。確かに、いくつかのコンテナで構成される複雑なアプリケーションのセットアップをサポートするサードパーティのコンテナとツールがすでに多数あります。
最後に、dockerおよびmicro-service architectureがあなたの問題にぴったりです。 この記事 に概説されているように、いくつかの理由があります。コアの問題の1つは、まったく新しいレイヤーの複雑さを追加することです。しかし、それは多くの解決策の場合であり、あなたはこれを認識しており、それ以外は喜んでいると思います。
docker run <container name> rake db:migrate
標準アプリケーションコンテナを起動しますが、CMD(Rails server
)、 だが rake db:migrate
PDATE: Romanが提案したコマンドは次のようになります。
docker exec <container> rake db:migrate