【问题标题】:delay chef until a resource has completed its task延迟厨师直到资源完成其任务
【发布时间】:2017-12-29 03:59:01
【问题描述】:

我有一个厨师食谱,它启动了一个 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 资源?

【问题讨论】:

    标签: mysql docker chef-infra devops


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我不确定资源是否已完成 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
      

      【讨论】:

        猜你喜欢
        • 2017-07-26
        • 1970-01-01
        • 2021-10-29
        • 2020-10-21
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        相关资源
        最近更新 更多