构建过程中和shell中的命令之间的区别

问题描述 投票:3回答:2

我有这样的Dockerfile

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt-get install imagemagick libmagickcore-dev libmagickwand-dev
RUN gem install bundle
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
COPY . /app
RUN bundle install

docker-compose.yml

version: '3.3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
    db_data:

我正在输入容器并运行bundle install命令:

docker-compose run web bundle install

它没有错误:

...
Bundle complete! 28 Gemfile dependencies, 98 gems now installed.
Bundled gems are installed into `/usr/local/bundle`

但是当我构建容器时会产生一些错误:

docker-compose build web

Bundler could not find compatible versions for gem "activemodel":
  In snapshot (Gemfile.lock):
    activemodel (= 5.2.1)

  In Gemfile:
    activeresource was resolved to 5.0.0, which depends on
activemodel-serializers-xml (~> 1.0) was resolved to 1.0.2, which depends
on
        activemodel (> 5.x)

    activeresource was resolved to 5.0.0, which depends on
      activemodel (< 6, >= 5.0)

    carrierwave was resolved to 1.2.3, which depends on
      activemodel (>= 4.0.0)

    protected_attributes was resolved to 1.0.2, which depends on
      activemodel (< 5.0, >= 4.0.0.beta)

    rails (= 5.2.1) was resolved to 5.2.1, which depends on
      activemodel (= 5.2.1)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 6

我试图了解这些环境之间的区别(?):构建过程和shell但命令bundle install是相同的。

为什么构建过程会产生错误?

附:

docker image list                                                                                                           docker●[ruby-2.5.1p57]
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              6f5884e6a480        2 minutes ago       987MB
dev_web             latest              44c878bad0f2        About an hour ago   1.21GB
<none>              <none>              ca720e782976        3 hours ago         1.21GB
ruby                2.5                 34d1c6024e99        37 hours ago        869MB

docker ps -a                                                                                                                docker●[ruby-2.5.1p57]
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
bbd1c5dfd92b        6f5884e6a480        "/bin/sh -c 'bundle …"   55 seconds ago      Exited (6) 39 seconds ago                                       elated_meitner
docker docker-compose dockerfile
2个回答
1
投票

运行docker-compose build web时,它将尝试根据Dockerfile中的规范构建docker镜像。当您运行docker-compose run web XXX时,它将使用命令XXX运行容器Web以用于现有映像。这意味着Dockerfile中的命令不会被执行。很可能错误来自Gemfile中的错误配置,但我没有经验。


1
投票

差异源于您在docker-compose.yaml中映射的体积。它会覆盖你的Dockerfile的最后四个步骤。具体来说,您似乎有不同的Gemfile构建容器并运行容器。

如果您跳过安装卷,在尝试运行容器中的install时应该会出现相同的错误。

© www.soinside.com 2019 - 2024. All rights reserved.