这是我的 Dockerfile
只希望我的 dockerfile 仅在 Gemfile 和 Gemfile.lock 发生更改时才进行捆绑安装,否则应该使用缓存进行捆绑安装
FROM ruby:3.0.2
RUN curl https://deb.nodesource.com/setup_18.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install -y --fix-missing nodejs postgresql-client yarn
#ENV BUNDLER_VERSION=2.1.4
RUN gem install bundler
# ENV RAILS_ENV production
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
COPY . /myapp
RUN npm install
RUN yarn add postcss
RUN yarn install
RUN bundle install
RUN RAILS_ENV=development bin/rails assets:precompile
#RUN bundle exec rails webpacker:install
#RUN bundle exec rake assets:clobber
#RUN bundle exec rake assets:precompile
EXPOSE 3000
我只是想要一个解决方案,请有人帮助我
通过这个解决方案,我们可以减少时间和负载,对吗?
Docker 在构建过程中使用多个层 (https://docs.docker.com/get-started/docker-concepts/building-images/understanding-image-layers/),就像洋葱一样。
如果您仅在复制 Gemfile 后安装捆绑包,如果 Gemfile(和 Gemfile.lock)没有更改,Docker 将能够缓存
bundle install
。
因为您在运行
bundle install
之前还复制了应用程序代码,所以无法缓存 gem - 因为 docker 不知道应用程序代码的更改是否会导致 bundle install
命令发生更改。
只需向上移动
bundle install
命令,如下所示。
您也可以对 JS 文件(package.json 等)执行此操作。
(另请注意,还有许多最佳实践可以应用于您的 Dockerfile,较新的 Rails 版本包括这些。或者您可以尝试 https://github.com/fly-apps/dockerfile-rails 对于较旧的 Rails版本。)
FROM ruby:3.0.2
RUN curl https://deb.nodesource.com/setup_18.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install -y --fix-missing nodejs postgresql-client yarn
#ENV BUNDLER_VERSION=2.1.4
RUN gem install bundler
# ENV RAILS_ENV production
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install # <-- move that here --------
COPY . /myapp
RUN npm install
RUN yarn add postcss
RUN yarn install
RUN RAILS_ENV=development bin/rails assets:precompile
#RUN bundle exec rails webpacker:install
#RUN bundle exec rake assets:clobber
#RUN bundle exec rake assets:precompile
EXPOSE 3000