Использование проданных драгоценных камней в vendor / cache с Docker - PullRequest
0 голосов
/ 26 мая 2020

Вот мой docker файл, который работает:

FROM ruby:2.6.6
WORKDIR /home/app/webapp
COPY . /home/app/webapp/
RUN bundle install
# Start the main process.
CMD ['/home/app/webapp/entrypoint.sh']

он отлично работает, но каждый раз устанавливает пакет! Вместо этого у меня есть все поставщики драгоценных камней в / vendor / cache непосредственно в самом источнике git.

$ ls vendor/cache
<..snip long list.>
rake-13.0.1.gem
rails-5.2.4.1.gem
rails-controller-testing-1.0.4.gem
rails-dom-testing-2.0.3.gem
rails-html-sanitizer-1.3.0.gem
rails-i18n-5.1.3.gem
rails-ujs-0.1.0.gem
sass-rails-5.0.8.gem
sprockets-rails-3.2.1.gem
<..snip long list.>

в соответствии с документами сборщика: https://bundler.io/bundle_install.html, это должно работать, как сказано:

При установке драгоценных камней Bundler проверит vendor / cache, а затем геммы вашей системы. Если гем не кэширован или не установлен, Bundler попытается установить его из источников, которые вы указали в своем Gemfile.

это действительно работает, когда я собираю на моем ma c без docker как показано ниже:

$ bundle 
Using rake 13.0.1
Using rails 5.2.4.1
Using rails-controller-testing 1.0.4
Using rails-i18n 5.1.3
Using rails-ujs 0.1.0
Using sidekiq-pro 4.0.4
Updating files in vendor/cache
Bundle complete! 144 Gemfile dependencies, 304 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

Следовательно, я изменяю свой файл докеров, чтобы воспользоваться преимуществами кеширования. поэтому я устанавливаю пакет только один раз и сохраняю его как слой. Затем при любых изменениях кода не требуется повторная установка пакета

FROM ruby:2.6.6
WORKDIR /home/app/webapp
COPY Gemfile Gemfile.lock /vendor/cache/ /home/app/webapp/
RUN bundle install
COPY . /home/app/webapp/
# Start the main process.
CMD ['/home/app/webapp/entrypoint.sh']

теперь, когда я пытаюсь построить это, я получил следующую ошибку:

$ docker-compose build
redis uses an image, skipping
db uses an image, skipping
Building rails
Step 1/6 : FROM ruby:2.6.6
 ---> 107c48f680c0
Step 2/6 : WORKDIR /home/app/webapp
 ---> Using cache
 ---> f23fc51ac8ba
Step 3/6 : COPY Gemfile Gemfile.lock /vendor/cache/ /home/app/webapp/
 ---> 0d1f451b7ee0
Step 4/6 : RUN bundle install
 ---> Running in 5768798c1bcd
Warning: the running version of Bundler (1.17.2) is older than the version that created the lockfile (1.17.3). We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
Fetching gem metadata from https://rubygems.org/.......
Could not find sidekiq-pro-4.0.4 in any of the sources
ERROR: Service 'rails' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 7

Однако, гем sidekiq-pro уже находится в вендоре / кеше

$ ls vendor/cache | grep sidekiq-pro
sidekiq-pro-4.0.4.gem

, поэтому он работает на локальном ma c без docker, поскольку сборщик извлекает драгоценный камень sidekiq из кеша, но он не работает с docker. Есть идеи, что еще я могу попробовать?

1 Ответ

1 голос
/ 26 мая 2020

Мне удалось это решить. необходимо отредактировать Dockerfile для копирования драгоценных камней в vendor / cache. Вот модифицированный гем-файл, который работает и использует docker кеширование

FROM ruby:2.6.6
WORKDIR /home/app/webapp
COPY Gemfile Gemfile.lock /home/app/webapp/
COPY vendor/cache /home/app/webapp/vendor/cache/
RUN bundle install
COPY . /home/app/webapp/
# Start the main process.
CMD ['/home/app/webapp/entrypoint.sh'] 

Добавление ответа здесь, на случай, если кто-то другой получит ту же ошибку. Спасибо, что посмотрели.

...