Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jekyll not updating static CSS, HTML files in docker development container

I am debugging an issue where I am doing my development inside of a Docker container, but Jekyll is not properly updating static HTML or CSS files after the first time it has been written. I have added the following code to static_file.rb after line 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

And I see that the fail triggered because the hash does not match. Instead, an older version of the static file at path has been copied to dest_path. I thought I was losing my mind, but I know that Docker uses layered file systems and so I wonder if I am hitting some kind of bug or known issue.

Are there any known issues with using the following technologies in tandem with each other:

  • Jekyll
  • Docker containers
  • Linux containers
  • FileUtils cp method
  • Ruby 2.2.3p173

I have had to work around it by running the following command:

cp s5/*.css _site/s5/
cp s5/*.html _site/s5/

Instead of having it work automatically for me with jekyll build.


Here is how I am linking my files to the docker image:

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

Docker version:

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

Docker info:

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

I am running this linked to a volume on OSX.


Here is an interactive session using binding.pry inside of static_file.rb. You can see that FileUtils.cp is not working properly.

In step 9-10 one can see I am manually invoking the FileUtils::cp command, and the resulting file hash is aa75cd.... I even try using FileUtils.cp to copy my original file to a different file path without success. However, in step 20-21, when I invoke the shell cp command directly using cp, it works and the resulting file has the proper hash of 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>)> 
like image 946
esilver Avatar asked Oct 12 '15 23:10

esilver


1 Answers

After doing the above analysis and determining that [FileUtils.cp][1] seemed to be at the root of this issue, I downgraded from Ruby 2.2.1 to Ruby 2.1.7p400, and this issue now appears to be corrected. It would appear that Ruby 2.2.1 has a potentially version serious regression in FileUtils.

like image 134
esilver Avatar answered Nov 15 '22 03:11

esilver