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

时间:2017-12-27 13:41:13

标签: mysql docker chef devops

我有一个厨师配方,它会调出一个mysql docker容器,然后,如果某些逻辑通过,则连接到它以加载一些数据库条目。

问题是,它总是在第一次运行时失败,因为在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资源?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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