Jekyll не обновляет статический CSS, файлы HTML в контейнере разработки докеров
Я отлаживаю проблему, когда я занимаюсь разработкой внутри контейнера Docker, но Jekyll не обновляет статические файлы HTML или CSS после первого раза, когда он был написан. Я добавил следующий код static_file.rb
после строки 83:
sha256_src = Digest::SHA256.file path
sha256_dst = Digest::SHA256.file dest_path
fail "invalid file copy: #{path} / #{dest_path}" unless sha256_src == sha256_dst
И я вижу, что сбой вызван, потому что хэш не соответствует. Вместо этого старая версия статического файла в path
была скопирована в dest_path
. Я думал, что я теряю рассудок, но я знаю, что Docker использует многоуровневые файловые системы, и поэтому я задаюсь вопросом, не нахожу ли я какую-то ошибку или известную проблему.
Существуют ли какие-либо известные проблемы с использованием следующих технологий в тандеме друг с другом:
Мне пришлось обойти это, выполнив следующую команду:
cp s5/*.css _site/s5/
cp s5/*.html _site/s5/
Вместо того, чтобы он автоматически работал у меня с jekyll build
.
Вот как я связываю свои файлы с изображением докеров:
export ABSPATH=$(cd "$(dirname "$0")"; cd ../; pwd)
docker run -d --name static -t -i -p 4000:4000 -p 2422:22 --link static-db:db -v "$ABSPATH:/mnt/app" me/static:0.0.2 /sbin/my_init --enable-insecure-key
Версия для докеров:
Client:
Version: 1.8.3
API version: 1.20
Go version: go1.4.2
Git commit: f4bf5c7
Built: Mon Oct 12 18:01:15 UTC 2015
OS/Arch: darwin/amd64
Server:
Version: 1.8.3
API version: 1.20
Go version: go1.4.2
Git commit: f4bf5c7
Built: Mon Oct 12 18:01:15 UTC 2015
OS/Arch: linux/amd64
Информация о докере:
Containers: 10
Images: 265
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 285
Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.1.10-boot2docker
Operating System: Boot2Docker 1.8.3 (TCL 6.4); master : af8b089 - Mon Oct 12 18:56:54 UTC 2015
CPUs: 1
Total Memory: 3.859 GiB
Name: dev
ID: ZY6F:2VSO:EDRL:TWYE:JAS6:5GC3:PPAO:TNA6:KCCB:HFLC:4IQB:5BYE
Debug mode (server): true
File Descriptors: 21
Goroutines: 33
System Time: 2015-10-18T18:36:20.08630971Z
EventsListeners: 0
Init SHA1:
Init Path: /usr/local/bin/docker
Docker Root Dir: /mnt/sda1/var/lib/docker
Username: me
Registry: https://index.docker.io/v1/
Labels:
provider=virtualbox
Я запускаю это, связанное с томом на OSX.
Вот интерактивный сеанс с использованием bind.pry внутри static_file.rb. Вы можете видеть, что FileUtils.cp работает неправильно.
На шаге 9-10 видно, что я вручную вызываю команду FileUtils::cp
, а результирующий хэш файла - aa75cd...
. Я даже пытаюсь использовать FileUtils.cp
, чтобы скопировать исходный файл на другой путь файла без успеха. Однако на этапе 20-21, когда я вызываю команду cp оболочки непосредственно с помощью cp
, она работает, и полученный файл имеет правильный хэш 724707...
.
Parsing Haml layouts...done.
Parsing Scss layouts...done.
Configuration file: /mnt/app/_config.yml
Source: /mnt/app
Destination: /mnt/app/_site
Generating...
From: /usr/local/lib/ruby/gems/2.2.0/gems/jekyll-2.5.3/lib/jekyll/static_file.rb @ line 92 Jekyll::StaticFile#write:
77: def write(dest)
78: dest_path = destination(dest)
79:
80: return false if File.exist?(dest_path) and !modified?
81: @@mtimes[path] = mtime
82:
83: FileUtils.mkdir_p(File.dirname(dest_path))
84: FileUtils.rm(dest_path) if File.exist?(dest_path)
85:
86: FileUtils.cp(path, dest_path)
87:
88: sha256_src = Digest::SHA256.file path
89: sha256_dst = Digest::SHA256.file dest_path
90:
91: if sha256_src != sha256_dst
=> 92: binding.pry
93: end
94: puts "invalid file copy: #{path} / #{dest_path}" unless sha256_src == sha256_dst
95:
96: true
97: end
[1] pry(#<Jekyll::StaticFile>)> path
=> "/mnt/app/styles/scruff5.css"
[2] pry(#<Jekyll::StaticFile>)> dest_path
=> "/mnt/app/_site/styles/scruff5.css"
[3] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file path
=> #<Digest::SHA256: 72470716291c6fef0c8c2151a0d0997f0991396cda964ba48e3cbb65cc7f7908>
[4] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file dest_path
=> #<Digest::SHA256: aa75cd20ddf51b86ec2344002532f08891e05eb1a0a9f7e5f99d8fda05c5c920>
[5] pry(#<Jekyll::StaticFile>)> dest_path
=> "/mnt/app/_site/styles/scruff5.css"
[6] pry(#<Jekyll::StaticFile>)> FileUtils.rm(dest_path)
=> ["/mnt/app/_site/styles/scruff5.css"]
[7] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file dest_path
Errno::ENOENT: No such file or directory @ rb_sysopen - /mnt/app/_site/styles/scruff5.css
from /usr/local/lib/ruby/2.2.0/digest.rb:49:in `initialize'
[8] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file path
=> #<Digest::SHA256: 72470716291c6fef0c8c2151a0d0997f0991396cda964ba48e3cbb65cc7f7908>
[9] pry(#<Jekyll::StaticFile>)> FileUtils.cp(path, dest_path)
=> nil
[10] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file dest_path
=> #<Digest::SHA256: aa75cd20ddf51b86ec2344002532f08891e05eb1a0a9f7e5f99d8fda05c5c920>
[11] pry(#<Jekyll::StaticFile>)> dest_path
=> "/mnt/app/_site/styles/scruff5.css"
[12] pry(#<Jekyll::StaticFile>)> dest_path = dest_path + '-2'
=> "/mnt/app/_site/styles/scruff5.css-2"
[13] pry(#<Jekyll::StaticFile>)> FileUtils.cp(path, dest_path)
=> nil
[14] pry(#<Jekyll::StaticFile>)> FileUtils.cp(path, dest_path)
=> nil
[15] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file dest_path
=> #<Digest::SHA256: aa75cd20ddf51b86ec2344002532f08891e05eb1a0a9f7e5f99d8fda05c5c920>
[16] pry(#<Jekyll::StaticFile>)> (Digest::SHA256.file dest_path).hexdigest
=> "aa75cd20ddf51b86ec2344002532f08891e05eb1a0a9f7e5f99d8fda05c5c920"
[17] pry(#<Jekyll::StaticFile>)> (Digest::SHA256.file path).hexdigest
=> "72470716291c6fef0c8c2151a0d0997f0991396cda964ba48e3cbb65cc7f7908"
[18] pry(#<Jekyll::StaticFile>)> FileUtils.rm dest_path
=> ["/mnt/app/_site/styles/scruff5.css-2"]
[19] pry(#<Jekyll::StaticFile>)> dest_path = '/mnt/app/_site/styles/scruff5.css'
=> "/mnt/app/_site/styles/scruff5.css"
[20] pry(#<Jekyll::StaticFile>)> `cp #{path} #{dest_path}`
=> ""
[21] pry(#<Jekyll::StaticFile>)> Digest::SHA256.file dest_path
=> #<Digest::SHA256: 72470716291c6fef0c8c2151a0d0997f0991396cda964ba48e3cbb65cc7f7908>
[22] pry(#<Jekyll::StaticFile>)>
Ответы
Ответ 1
После выполнения вышеуказанного анализа и определения того, что [FileUtils.cp][1]
, похоже, лежит в основе этой проблемы, я понизил с Ruby 2.2.1 до Ruby 2.1.7p400, и теперь эта проблема исправлена. Похоже, что Ruby 2.2.1 имеет потенциальную версию серьезной регрессии в FileUtils
.