web-dev-qa-db-ja.com

vagrant同期フォルダーの内容を事前入力します

私は現在、かなり複雑なサーバースタック(Ruby on Rails app))を構築しており、開発者がすべてをインストールしなくても作業できるようにしたいと考えています。したがって、私はVagrantを使用して彼らにそれを許可します。

イメージを最初にインストールすると、最新のソースがプルされ、依存関係がインストールされます。ソースは同期フォルダー(vagrantに組み込まれている機能)によって公開されるため、開発者はソースをコミットして独自の環境で編集できます。 Vagrant-boxはサーバー専用です。

Vagrantfileの同期フォルダエントリ:

config.vm.synced_folder "gameeso/", "/var/gameeso", :create => "true" 

このイメージは、起動スクリプト(スクリプトは起動時に実行され、インターネット接続が確立されている場合にのみ実行されます)を備えたUbuntuサーバーです。

  • Githubから最新の開発ブランチをプルします(フォルダーがまだ存在しない場合)

  • 依存関係をインストールします(これはスクリプトによって実行されます)

  • サーバーを起動します

これはすべて、同期されたフォルダーで行われます。このアプローチにはいくつか問題がありました。主に、Vagrantがゲストシステムの同期フォルダーをクリアすることです。 pstartスクリプトに「sleep10」を追加してこの問題を解決したので、Vagrantが同期フォルダーをセットアップするまで待機できます。

もちろん、これは安全な方法ではありません(起動に10秒以上かかる場合は、最近ではありそうもないのですが、知りたくありません;))

私の質問は次のとおりです。guest-Host(vagrant image)が同期されたフォルダーにデータを入力できるようにするためのより良い方法はありますか?

もちろん、よろしくお願いします!

5
user125756

Vagrantの組​​み込み プロビジョニング 機能はこれに完全に適合するはずです。それを行う方法はたくさんありますが、おそらく最も簡単なのは、Upstartスクリプトの本質を理解して、それらをプレーンなシェルスクリプトにすることです。次に、これらのブロックの1つをVagrantfileに配置します。

  1. 「インライン」スクリプトを使用します。VagrantはコンテンツをVagrantfileから/tmpディレクトリのスクリプトにコピーします。それを実行します。

    $script = <<<SCRIPT
    // The contents of your script go here
    SCRIPT
    
    config.vm.provision "Shell", inline: $script
    

    ここでのスクリプトは "heredoc" 内にあることに注意してください。つまり、ヒアドキュメントを終了するSCRIPTトークンが正しい場所にあることを確認する必要があります。余分な空白なしで、それ自体で行上に。 (上記のヒアドキュメントに関するリンクは空白を許可する方法を示していますが、とにかく注意する必要があります。)

  2. スクリプトファイルを指しています。 Vagrantはこのファイルを/tmpディレクトリにコピーして実行します。

    config.vm.provision "Shell", path: "setup.sh"
    

    ここでのパスはVagrantfileの場所を基準にしていることに注意してください。 ただし、ファイルはその場所から実行されないため、ファイルを特定のディレクトリに配置する必要がある場合は、方法#3に従う必要があります。

  3. スクリプトファイルを指す「インライン」スクリプトを使用します。このようにして、選択した場所でスクリプトを実行できます(以下の例では、 chmodのような前提条件を実行した後、または環境変数を設定した後、/vagrantで。

    $script = <<SCRIPT
    chmod +x /vagrant/setup.sh
    cd /vagrant
    ./setup.sh
    SCRIPT
    
    config.vm.provision "Shell", inline: $script
    

「実際の」展開およびプロビジョニングシステムを介して機能するプロビジョニング方法を使用することもできますが、要件によってはやり過ぎになる可能性があります。

2
Moshe Katz