延迟厨师,直到资源完成其任务

我有一个厨师的食谱,带来了一个MySQLdocker容器,然后,如果通过一些逻辑,连接到它加载一些数据库条目。

问题是,它总是首先运行失败,因为在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" 

正如你所看到的,我有点破坏了这个过程,所以它会做几次重试,但是这只会引入一个竞争条件。 如何告诉厨师阻止docker_container资源,直到容器完全准备好?

资源已经完成,问题是docker run本身不是一个阻塞的过程。 您可能会想要使用ruby_block资源和一些Ruby代码来hibernate,直到容器实际启动并且服务器进程正在接受连接。