Подтвердить что ты не робот

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>)> 
4b9b3361

Ответ 1

После выполнения вышеуказанного анализа и определения того, что [FileUtils.cp][1], похоже, лежит в основе этой проблемы, я понизил с Ruby 2.2.1 до Ruby 2.1.7p400, и теперь эта проблема исправлена. Похоже, что Ruby 2.2.1 имеет потенциальную версию серьезной регрессии в FileUtils.