Docker COPY无法找到Gemfile:没有这样的文件或目录

时间:2018-07-05 21:16:03

标签: ruby-on-rails docker docker-compose

我目前正在通过docker设置Rails样板。当我尝试运行docker build .时,出现以下错误:

Step 5/8 : COPY Gemfile /app/
COPY failed: stat /var/lib/docker/tmp/docker-builder090950451/Gemfile: no such file or directory

我正在按照documentation中的说明进行操作,但仍无法构建图像。

这是我的Dockerfile

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR /app

# Copy the existing Gemfile
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

# Install Gems
RUN bundle install
COPY . /app

我还有以下docker-compose.yml文件:

version: '3'
services:
  db:
    image: postgres # To Edit - Default is postgresql.
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

我通过运行docker-compose run web rails new app --force --database=postgresql生成了Rails应用程序,它确实使用其Gemfile生成了Rails应用程序,如下图所示。enter image description here

但是,在生成rails应用程序并运行docker-compose build之后,出现以下错误:

db uses an image, skipping
Building web
Step 1/7 : FROM ruby:2.5
 ---> 55fb4a37704e
Step 2/7 : RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
 ---> Using cache
 ---> afb6f347904c
Step 3/7 : WORKDIR /app
 ---> Using cache
 ---> 1fdbd260685d
Step 4/7 : COPY Gemfile /app/Gemfile
ERROR: Service 'web' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder885442968/Gemfile: no such file or directory

5 个答案:

答案 0 :(得分:1)

问题是我将容器目录和应用程序目录命名为相同的app,这导致找不到Gemfile的问题。

我将Dockerfile更新为:

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR /webapp

COPY ./app/Gemfile /webapp/Gemfile
COPY ./app/Gemfile.lock /webapp/Gemfile.lock

RUN cd /webapp && bundle install
ADD . /webapp

,然后在docker-compose.yml中,将volumes更改为:

volumes:
      - .:/webapp

仅当您希望独立使用Rails应用程序并且希望Docker文件位于Rails应用程序之外时,这才适用。

答案 1 :(得分:0)

您需要删除./dir /

COPY ./Gemfile /webapp/Gemfile 
COPY ./Gemfile.lock /webapp/Gemfile.lock

答案 2 :(得分:0)

这里的问题是,如果您有一行: WORKDIR / app ,您已经在polder应用程序中。因此,当您将某些内容复制到docker容器中时,无需编写./app或/ app,因为。表示这已经是一个应用了。而且,如果您编写了这样的东西,它将被复制到WORKDIR内部的新 app 目录中,路径将为 / app / app 。 在您的情况下,Dockerfile应该如下所示:

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR /app

# Copy the existing Gemfile
COPY Gemfile Gemfile.lock .

# Install Gems
RUN bundle install
COPY . .

答案 3 :(得分:0)

Ubuntu 18.04中运行 Rails 应用程序时,我仍然遇到相同的问题。

我遇到此错误:

错误:服务'app'构建失败:COPY失败:stat / var / lib / docker / tmp / docker-builder805666212 / Gemfile:没有此类文件或目录

问题是我有多个docker-compose.yml文件,并且我将文件更改为错误的文件,该文件位于目录而不是根目录中。

我要做的就是删除该docker-compose.yml并在根目录的docker-compose.yml上进行文件更改。

然后,我在根目录下的docker-compose.yml文件中运行以下命令:

docker-compose build

一切都恢复正常。

仅此而已。

我希望这会有所帮助

答案 4 :(得分:0)

我有一个名为bundle的较早的卷,已被另一个docker映像使用。

因此,每当我运行另一个docker映像时,该映像具有不同的工作目录,并且还需要一个bundle卷,它会抛出与上述类似的错误消息。

要解决此问题,我只需要修剪旧的卷(包括旧的bundle卷),然后重新运行构建

docker volume prune

docker build .