2017-12-27 8 views
0

나는 요리사 레시피를 통해 myserie 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

리소스가 완료되었습니다. 문제는 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 
관련 문제