【问题标题】:Docker image working on Ubuntu 16.04 but failing on Ubuntu 18.04Docker 映像在 Ubuntu 16.04 上工作,但在 Ubuntu 18.04 上失败
【发布时间】:2019-03-22 13:04:39
【问题描述】:

我认为 docker 映像独立于操作系统工作,不需要在操作系统本身上安装任何依赖项。

我有一个使用 dockerfile 构建的 docker 镜像:

FROM ubuntu:16.04

# Prepare to install Java for 'rjb' gem
RUN apt-get update && apt-get -y install software-properties-common && add-apt-repository ppa:webupd8team/java -y && apt-get update 

# Install Java 8 and accept the license by default (https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04)
RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections && apt-get -y install oracle-java8-installer && java -version 

# Set JAVA_HOME (should add in the docker startup script)
RUN echo 'export JAVA_HOME="/usr/lib/jvm/java-8-oracle"' >> /etc/environment && . /etc/environment && echo $JAVA_HOME 

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# Install curl, rvm, ruby 2.1.5p273, rails 4.2.6
RUN apt-get -y update && apt-get -y install build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev && apt-get -y install wget && apt-get install -y ruby-full && ruby -v && gem install rails -v 4.2.6 && rails -v

# Install bundler, git
RUN gem install bundler && apt-get -y install git

ENV DEBIAN_FRONTEND noninteractive   

# Make sure 'bundle install' run successfully and set the git pre-commit hooks
RUN ["/bin/bash", "-c", "cd home && mkdir expertiza_developer && cd expertiza_developer && git clone https://github.com/expertiza/expertiza.git && cd expertiza && apt-get -y install ruby-dev && apt-get -y install make && apt-get install -y gcc make && apt-get install -y libmysqlclient-dev && apt-get install -y libpq-dev && bundle install && debconf-set-selections <<< 'mysql-server mysql-server/root_password password ' && debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password ' && apt-get -y install mysql-server && /etc/init.d/mysql start && cp config/database.yml.example config/database.yml && cp config/secrets.yml.example config/secrets.yml && mv ./hooks/pre-commit ./.git/hooks/pre-commit && chmod 755 ./.git/hooks/pre-commit"]

并使用以下 docker-compose 文件运行镜像:

version: '3'

services:
  expertiza:
    image: winbobob/expertiza:test
    ports:
      - '3000:3000'
    volumes:
      - '.:/root/expertiza'
    depends_on:
      - scrubbed_db
      - redis
    links:
      - scrubbed_db
      - redis
    working_dir: /root/expertiza
    command: bundle exec thin start -p 3000
    environment:
      REDIS_HOST: redis

  scrubbed_db:
    image: mysql:5.7
    volumes:
      # https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile
      - './docker/scrubbed_db:/docker-entrypoint-initdb.d'
    environment:
      MYSQL_ROOT_PASSWORD: expertiza

  redis:
    image: redis:alpine

这在 Ubuntu 16.04 机器上运行得非常好,但是当我在 Ubuntu 18.04 机器上运行相同的图像时,我收到以下错误:

expertiza_1    | /var/lib/gems/2.3.0/gems/bundler-1.16.4/lib/bundler/spec_set.rb:91:in `block in materialize': Could not find rubyzip-1.2.2 in any of the sources (Bundler::GemNotFound)

有谁知道为什么会发生这种情况以及如何解决它?

【问题讨论】:

  • 确保你的 docker-compose 是最新的..
  • 您的评论 #install .. ruby 2.1.5p273 也不准确。您只是在使用apt-get install ruby-full,此时可能是2.5.1。这很可能与 rails 4.2 存在兼容性问题

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


【解决方案1】:

您没有指定要与apt-get install 一起安装的软件包的版本。因此,对于您正在使用的发行版,您只能使用可用于这些软件包的任何版本。

在这种情况下,您认为您正在安装 Ruby 2.1.5,但在 16.04 上您实际上正在安装 Ruby 2.3.0,而在 18.04 上您正在安装 Ruby 2.5.1。您的RUN 命令包含ruby -v,因此请检查您的构建日志以确认您没有获得您期望的版本。

另外,请确保 gem install rubyzip -v 1.2.2 用作 RUN 命令,rubyzip 在您的 Gemfile 中定义,并且正确的版本在 Gemfile.lock 中定义,并且无论 gem 服务器捆绑器指向的任何一个副本都有一个副本那个版本的 gem。

接下来,您尝试使用 Rails 4.2.6,但 Rails 4.2.6 与 Ruby 2.5.1 不兼容。它也与 2.4 不兼容。 Rails 4 的第一个支持 Ruby 2.4 的版本是4.2.8rc1,Rails 4 的当前版本是4.2.10。

确保您正在安装所需软件包的正确版本,并且您的应用程序和库正在使用兼容的版本。此外,考虑将您的 Ruby 版本升级为 support of Ruby 2.1 has ended。 (一年多前就结束了)

最后,考虑使用已经有 Ruby 的 Docker 镜像,而不是通过apt-get 安装 Ruby。例如,the 2.3-stretch image 为您提供 Ruby 2.3 最新版本的 Debian 延伸。 Other versions are also available。使用这些 Dockerfile 之一的好处是,您可以确切地知道所获得的 Ruby 版本并且它不会改变。

【讨论】:

  • 我的 docker 镜像已经在 docker hub 上创建了。我只是用 docker pull 把它拉下来。
  • 这不是重点。重点是使用已经安装了 Ruby 的 Docker 映像,这样可以降低任务的复杂性。
猜你喜欢
  • 2019-06-12
  • 2018-10-06
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多