我只希望我的 dockerfile 仅在 Gemfile 和 Gemfile.lock 发生更改时才进行捆绑安装 ........ ruby on Rails,docker

问题描述 投票:0回答:1

这是我的 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

我只是想要一个解决方案,请有人帮助我

通过这个解决方案,我们可以减少时间和负载,对吗?

ruby-on-rails docker ubuntu dockerfile devops
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.