2017-12-27 197 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

我不確定資源是否已完成coderanger說。

您是否嘗試通過兩種資源的轉儲操作? :

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