Во втором запуске chef-client ленивый атрибут docker_container для "link" не разрешается и ему передается нечитаемое значение
Я впервые спрашиваю о переполнении стека, здесь, в Китае, я редко могу встретиться с любым разработчиком-шефом, чтобы поговорить о моей проблеме, поэтому я публикую его здесь, чтобы обратиться за помощью. Эта проблема беспокоила меня уже несколько недель, и я все еще пытаюсь ее решить.
вот мое сообщение об ошибке:
* directory[/root/tools/projectname/../bootproxy] action create (up to date)
* шаблон [/root/tools/projectname/../bootproxy/oc.proxy.conf] действие create (до даты)
* каталог [/root/tools/projectname/../bootproxy] действие create (до даты)
* file[/tmp/dockerinfo.txt] action delete
- удалить файл /tmp/dockerinfo.txt
* bash[docker ps -a|grep -v CONTAINER|grep -v monitor|awk '{print $1, $NF}'] действие run - выполнить "bash" "/tmp/chef-script20170319-2107-fx41as"
* ruby_block[результат] действие run - выполнить результат блока ruby * docker_container[bootproxy] действие redeploy - остановка bootproxy (завершит работу через 30 с)
- удаление bootproxy
====================================================================================== Ошибка при выполнении действия redeploy
на ресурсе 'docker_container[bootproxy]'
=====================================================================================
Docker::Error::ServerError
--------------------------
Could not get container for bootproxy
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:319:in `block (3 levels) in <class:DockerContainer>'
/var/chef/cache/cookbooks/docker/libraries/helpers_base.rb:66:in `with_retries'
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:250:in `block (2 levels) in <class:DockerContainer>'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:81:in `converge_if_changed'
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:247:in `block in <class:DockerContainer>'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:132:in `instance_eval'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:132:in `compile_and_converge_action'
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:169:in `call_action'
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:360:in `block in <class:DockerContainer>'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:132:in `instance_eval'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:132:in `compile_and_converge_action'
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:169:in `call_action'
/var/chef/cache/cookbooks/docker/libraries/docker_container.rb:403:in `block in <class:DockerContainer>'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:132:in `instance_eval'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb:132:in `compile_and_converge_action'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb:78:in `run_action'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb:106:in `block (2 levels) in converge'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb:106:in `each'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb:106:in `block in converge'
/var/chef/cache/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb:105:in `converge'
Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/webserver/recipes/default.rb
218: docker_container container_name do
219: repo docker[:image]
220: tag docker[:tag]
221: #Add all docker link
222: # links node.set[:linking]
223: links lazy{node.run_state[:linking]}
224: env docker[:env]
225: command docker[:command]
226: kill_after 30
227: # autoremove true
228: action :redeploy
229: port docker[:ports]
230: volumes node.default["bindvolume"]
231: cap_add 'SYS_ADMIN'
232: devices []
233: privileged true
234: timeout 30
235: # {["/dev/fuse"]}
236: end
237: else
238: docker_container container_name do
239: repo docker[:image]
240: tag docker[:tag]
241: #Add all docker link
242: links node.run_state[:linking]
243: env docker[:env]
244: command docker[:command]
245: kill_after 30
246: # autoremove true
247: action :redeploy
248: port docker[:ports]
249: volumes node.default["bindvolume"]
250: cap_add 'SYS_ADMIN'
251: devices []
252: privileged true
253: timeout 30
254: # {["/dev/fuse"]}
255: end
256: end
257:
258: if (not (defined?(docker[:exec])).nil?) && (not "#{docker[:exec]}" == "")
259: execute 'execute command inside docker' do
260: command "docker exec -i #{container_name} /bin/bash -c \'#{docker[:exec]}\'"
261: end
262: end
263:
264: etchosts.push("#{container_name}:#{container_name}")
265: end
266:
267: #Add proxy.conf to folder if bootproxy defined
268: if defined?(node[:externalmode]) && node[:externalmode].eql?("bootproxy")
269: #Prepare bootproxy directories
270: directory "#{node[:deploycode][:basedirectory]}../bootproxy" do
Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/webserver/recipes/default.rb:218:in `block in from_file'
docker_container("bootproxy") do
action [:redeploy]
retries 0
retry_delay 2
default_guard_interpreter :default
declared_type :docker_container
cookbook_name "webserver"
recipe_name "default"
kill_after 30
repo "daocloud.io/library/nginx"
tag "stable-alpine"
exposed_ports {"80/tcp"=>{}, "5000/tcp"=>{}}
port_bindings {"80/tcp"=>[{"HostIp"=>"0.0.0.0", "HostPort"=>"80"}], "5000/tcp"=>[{"HostIp"=>"0.0.0.0", "HostPort"=>"5000"}]}
port ["80:80", "5000:5000"]
volumes_binds ["/root/tools/projectname/../bootproxy:/etc/nginx/conf.d/"]
links #<ChefCompat::CopiedFromChef::Chef::DelayedEvaluator:0x000000055c4a90@/var/chef/cache/cookbooks/webserver/recipes/default.rb:223>
cap_add ["SYS_ADMIN"]
privileged true
timeout 30
connection #<Docker::Connection:0x00000008301238 @url="unix:///", @options={:socket=>"/var/run/docker.sock", :read_timeout=>60}>
network_mode "bridge"
detach true
signal "SIGTERM"
end
Запущенные обработчики: [2017-03-19T21:20:15+08:00] ОШИБКА: запущенные обработчики исключений Запущенные обработчики завершены [2017-03-19T21: 20: 15 + 08: 00] ОШИБКА: завершенные обработчики исключений Ошибка клиента Chef. 20 ресурсов обновляются за 34 секунды [2017-03-19T21: 20: 15 + 08]. FATAL: стэк трассировки выгружен в /var/chef/cache/chef-stacktrace.out [2017-03-19T21: 20: 15 + 08: 00] ОШИБКА: docker_container [bootproxy] (webserver:: строка 218 по умолчанию) произошла ошибка: Docker:: Error:: ServerError: Не удалось получить контейнер для bootproxy
[2017-03-19T21:20:15+08:00] FATAL: Chef::Exceptions::ChildConvergeError: Процесс запуска Chef завершился неудачно (код выхода 1)
и вот мои коды:
node.run_state[:linking] = []
#Special handling if bootproxy, get all local running docker id and name and link into bootproxy
if localfolder.eql?("bootproxy")
container_name = localfolder
node.set[:dockerinfo] = []
results = "/tmp/dockerinfo.txt"
file results do
action :delete
end
cmd = "docker ps -a|grep -v CONTAINER|grep -v monitor|awk \'{print $1, $NF}\'"
bash cmd do
code <<-EOH
#{cmd} > #{results}
EOH
end
ruby_block "result" do
only_if { "cat #{results}| wc -l;while [ $? -ne 0 ]; do cat #{results}| wc -l;done" }
# only_if { ::File.exists?(results) }
block do
f = File.open(results)
dockerinfo = Hash.new
f.each do |line|
dockerinfo[line.chomp.split(' ')[0]] = line.chomp.split(' ')[1]
end
f.close
node.set[:dockerinfo] = dockerinfo
node.run_state[:linking] = dockerinfo
node.run_state[:linking] = []
node.set[:dockerinfo].each do |hash, dockername|
node.run_state[:linking].push("#{dockername}:#{dockername}")
end
end
end
else
node.run_state[:linking] = etchosts
end
if node.default["bindvolume"].eql?([":"])
node.default["bindvolume"] = nil
end
if localfolder.eql?("bootproxy")
# Using lazy evaluation if bootproxy
docker_container container_name do
repo docker[:image]
tag docker[:tag]
#Add all docker link
# links node.set[:linking]
links lazy{node.run_state[:linking]}
env docker[:env]
command docker[:command]
kill_after 30
# autoremove true
action :redeploy
port docker[:ports]
volumes node.default["bindvolume"]
cap_add 'SYS_ADMIN'
devices []
privileged true
timeout 30
# {["/dev/fuse"]}
end
else
docker_container container_name do
repo docker[:image]
tag docker[:tag]
#Add all docker link
links node.run_state[:linking]
env docker[:env]
command docker[:command]
kill_after 30
# autoremove true
action :redeploy
port docker[:ports]
volumes node.default["bindvolume"]
cap_add 'SYS_ADMIN'
devices []
privileged true
timeout 30
# {["/dev/fuse"]}
end
end
То, что я пытаюсь сделать здесь, это запустить набор докеров с помощью поваренной книги chef docker версии 2.14.3, с именами, зацикливающимися в "localfolder", а когда localfolder = "bootproxy", выполнить команду bash, чтобы проверить, какие докеры работают в данный момент. и свяжите их с помощью докера nginx с именем "bootproxy".
Моя проблема здесь заключается в том, что всякий раз, когда я очищал весь свой кеш или после того, как я перезагружал всю мою кулинарную книгу "веб-сервер", клиент-шеф работает нормально без ошибок. Но когда я снова запускаю шеф-клиента, я получил
Docker::Error::ServerError
--------------------------
Could not get container for bootproxy
из-за значения "links" в "docker_container" ресурсы стали "#" вместо массива, который включал имена текущих запущенных докеров, такие как [ "container1:container1", "container2:container2", "container3:container3"]. Поэтому я подозреваю, что ruby_block, который пытается получить значение от хоста, кэшируется и не запускается после первого последовательного выполнения. Мое удаление кеша (rm -rf /var/chef/cache) доказало это, но я не могу определить удаление кеша внутри кулинарной книги (не очень хороший способ решить это тоже). Мне нужно сделать так, чтобы шеф-клиент мог перезапускаться, поскольку я использую его для развертывания своего набора кодов во всей среде. Пожалуйста, дайте мне любой совет для этого.
Спасибо!
1 ответ
Я думаю, что вы пропустили исправление второго ресурса, он не использует lazy{}
помощник.
В целом, этот код является беспорядком, поэтому трудно сказать, что он делает. Я рекомендую написать много тестов и, возможно, больше комментариев.