Ruby on rails 钢轨束“;Can';“在任何来源中都找不到宝石”;仅在Docker容器中
我在Docker容器中使用Rails,每隔一段时间我就会遇到这个我不知道如何解决的问题。将新gem添加到Gemfile时,在重建Docker Image+容器时,构建将失败,出现常见绑定器错误Ruby on rails 钢轨束“;Can';“在任何来源中都找不到宝石”;仅在Docker容器中,ruby-on-rails,docker,rubygems,Ruby On Rails,Docker,Rubygems,我在Docker容器中使用Rails,每隔一段时间我就会遇到这个我不知道如何解决的问题。将新gem添加到Gemfile时,在重建Docker Image+容器时,构建将失败,出现常见绑定器错误无法在任何源中找到[gem_NAME];运行“bundle install”安装缺少的gems。这仅在我尝试在Docker中构建映像时才会发生,如果我在本地计算机上运行常规的捆绑安装,Gemfile将正确安装,并且一切正常 我有一个相当标准的Dockerfile&docker compose文件 Docke
无法在任何源中找到[gem_NAME];运行“bundle install”安装缺少的gems
。这仅在我尝试在Docker中构建映像时才会发生,如果我在本地计算机上运行常规的捆绑安装
,Gemfile将正确安装,并且一切正常
我有一个相当标准的Dockerfile&docker compose
文件
Dockerfile:
FROM ruby:2.6.3
ARG PG_MAJOR
ARG BUNDLER_VERSION
ARG UID
ARG MODE
# Add POSTGRESQL to the source list using the right version
RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
&& echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list
ENV RAILS_ENV $MODE
RUN apt-get update -qq && apt-get install -y postgresql-client-$PG_MAJOR vim
RUN apt-get -y install sudo
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY Gemfile /usr/src/app/Gemfile
COPY Gemfile.lock /usr/src/app/Gemfile.lock
ENV BUNDLER_VERSION $BUNDLER_VERSION
RUN gem install bundler:$BUNDLER_VERSION
RUN bundle install
COPY . /usr/src/app
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
docker compose.yml
:
版本:“3”
服务:
后端:
建造:
dockerfile:dockerfile
args:
UID:${UID:-1001}
BUNDLER_版本:2.0.2
PGU专业:10
模式:发展
tty:是的
标准开放:正确
卷数:
-./[修订]:/usr/src/app
-gem\u data\u api:/usr/local/bundle:cached
端口:
- "3000:3000"
用户:root
我尝试了docker system prune-a,docker builder prune-a
,重新安装docker,连续多次重建,重新启动我的机器等等,但都没有成功。奇怪的是,我决定添加的每一块新宝石都不会出现这种情况,只会添加一些特定的宝石。例如,我在尝试将gem'sendgrid ruby'
添加到我的gem文件时再次遇到了这个问题。是供参考的gem的repo,我使用sendgrid ruby
得到的具体错误是在任何源代码中都找不到ruby\u http\u client-3.5.1。我尝试在gem文件中指定ruby\u http\u客户端
,还尝试ssh
插入Docker容器并运行gem install ruby\u http\u客户端
,但我得到了相同的错误
这里可能会发生什么?您正在容器的/usr/local/bundle
目录上装载一个命名卷。命名卷将从映像中填充,但仅在第一次运行容器时。在此之后,命名卷的旧内容将优先于映像的内容:以这种方式使用卷将导致Docker完全忽略您在Gemfile
中所做的任何更改
您应该能够从docker compose.yml
文件中删除volumes:
行。我不清楚将已安装的gems保存在命名卷中会有什么好处