我认为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)
有人知道为什么会这样以及如何解决吗?
答案 0 :(得分: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兼容。支持Ruby 2.4的第一个Rails 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版本,并且它不会改变。