2017-12-27 18 views
0

私はシェフのレシピを持っていて、mysqlドッカーコンテナを持ってきて、あるロジックがパスするとそこに接続してデータベースエントリをロードします。リソースがタスクを完了するまでシェフを遅らせる

問題は、mysqlコンテナが起動して接続を受け入れる準備が整う前に、データの復元を担当するリソースに移動するため、常に最初に実行されないという問題です。ここで

は、コンテナのもたらすレシピの一部です:

docker_container 'imhere-mysql' do 
    hostname mysqlHost 
    repo 'lutraman/imhere' 
    tag 'mysql' 
    env ["MYSQL_ROOT_PASSWORD=#{mysql_password}"] 
    volumes [ '/var/imhere/mysql:/var/lib/mysql' ] 
    action :run 
end 

、ここでは、復元を行い一部です:

remote_file "#{parent_data_dir}/#{db_restore_filename}" do 
    source "#{db_restore_url}/#{db_restore_filename}" 
    notifies :run, 'execute[mysql_load_dump]' 
end 

execute "mysql_load_dump" do 
    command "#{scripts_dir}/mysql_restore_dump.sh" 
    environment(
    'MYSQL_HOSTNAME' => mysqlHost, 
    'PARENT_DATA_DIR' => parent_data_dir, 
    'DB_RESTORE_FILENAME' => db_restore_filename, 
    'MYSQL_PASSWORD' => mysql_password, 
    'RETRIES' => "10" 
) 
    action :nothing 
end 

これはあまり関係が、ちょうど完全性のためです、ここでスクリプトが最終的に実行するものは次のとおりです。

MYSQL_IP_ADDRESS=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $MYSQL_HOSTNAME) 

gunzip -c $PARENT_DATA_DIR/$DB_RESTORE_FILENAME | \ 
mysql -h $MYSQL_IP_ADDRESS -D imhere -u root -p"$MYSQL_PASSWORD" 

ご覧のとおり、私はpをハッキングしましたそれはいくつかの再試行を行いますが、それは競合状態を導入するだけです。コンテナの準備が整うまでシェフにdocker_containerリソースをブロックするように指示するにはどうすればよいですか?

答えて

2

リソースは完了しましたが、問題はdocker run自体がブロックプロセスではないということです。 ruby_blockリソースといくつかのRubyコードを使用して、コンテナが実際に起動し、サーバプロセスが接続を受け入れるまで、スリープ状態にすることをお勧めします。

0

リソースが完了したかどうかわかりません。

両方のリソースからダンプアクションを通知しようとしましたか? :

docker_container 'imhere-mysql' do 
    hostname mysqlHost 
    repo 'lutraman/imhere' 
    tag 'mysql' 
    env ["MYSQL_ROOT_PASSWORD=#{mysql_password}"] 
    volumes [ '/var/imhere/mysql:/var/lib/mysql' ] 
    notifies :run, 'execute[mysql_load_dump]', :delayed 
    action :run 
end 

remote_file "#{parent_data_dir}/#{db_restore_filename}" do 
    source "#{db_restore_url}/#{db_restore_filename}" 
    notifies :run, 'execute[mysql_load_dump]', :delayed 
end 

execute "mysql_load_dump" do 
    command "#{scripts_dir}/mysql_restore_dump.sh" 
    environment(
    'MYSQL_HOSTNAME' => mysqlHost, 
    'PARENT_DATA_DIR' => parent_data_dir, 
    'DB_RESTORE_FILENAME' => db_restore_filename, 
    'MYSQL_PASSWORD' => mysql_password, 
    'RETRIES' => "10" 
) 
    action :nothing 
end 
関連する問題