关于ruby:在rails docker容器中找不到rake-11.1.2

Could not find rake-11.1.2 in rails docker container

我在操作两个码头集装箱。一个带Rails,一个带Postgres DB。这是我的Docker撰写文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Docs: https://docs.docker.com/compose/compose-file/
version: '2'
services:
  db:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=xxx

  rails:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      -"3000:3000"
    links:
      - db
    depends_on:
      - db

这里是Rails应用程序的dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM ruby:2.3

RUN apt-get update
RUN apt-get install -y build-essential nodejs

RUN mkdir -p /app
WORKDIR /app

COPY Gemfile Gemfile.lock ./
RUN gem install bundler && bundle install --jobs 20 --retry 5

COPY . ./

EXPOSE 3000

ENTRYPOINT ["bundle","exec"]

CMD ["rails","server","-b","0.0.0.0"]

当我运行docker-compose up时,一切正常,我可以通过Docker机器的IP地址连接到服务器。

当我尝试使用以下命令连接到容器时:

1
docker-compose run rails console

我得到这个错误:

1
2
Could not find rake-11.1.2 in any of the sources
Run `bundle install` to install missing gems.

在容器内进行捆绑安装没有任何效果,并且所述gem是绝对安装的。在其他堆栈溢出问题中提到我应该运行bin/spring stop。于是我跑了起来:

1
docker-compose run bin/spring stop

它又回来了:

1
Spring is not running

我对Ruby/Rails和Docker还比较陌生。希望有人能在这里帮助我!提前谢谢

附:感谢对码头文件的评论!


似乎回答得晚了,但我还是会回答的。我有根据的猜测是,你的Gemfile.lock正在钉住你的rake版本,这就是为什么它在抱怨。如果运行docker build时没有像在docker-compose.yml中那样定义的卷,那么很容易就会这样结束。所以试试看。

关于您的Dockerfile:如果您仅将其用于开发目的,那么这可能是正常的。否则,您应该考虑使用不同的用户来运行它(使用useradd创建用户,并相应地运行RUN任务等等)。您可能还需要使用一些bundler特性,如--path=选项。


我们也有同样的问题。尽管斯普林说它没有运行,但我的同事向我指出,如果我观察一下bin/rails,我会发现它实际上是用铁轨运行的。删除Gemfile中与spring相关的gems解决了这个问题。