Образ Docker, работающий в Ubuntu 16.04, но не работающий в Ubuntu 18.04 - PullRequest
0 голосов
/ 17 октября 2018

Я думал, что образы докера работают независимо от ОС и не нуждаются в каких-либо зависимостях, установленных в самой ОС.

У меня есть образ докера, созданный с использованием файла 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)

Кто-нибудь знает, почему это происходит и как это исправить?

1 Ответ

0 голосов
/ 18 октября 2018

Вы не указываете версию пакетов, которые вы хотите установить с 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, так как поддержка Ruby 2.1 закончилась .(и это закончилось более года назад)

Наконец, рассмотрите возможность использования образа Docker, в котором уже есть Ruby, вместо установки Ruby через apt-get.Например, 2.3-stretch image дает вам растяжку Debian с последней версией Ruby 2.3. Другие версии также доступны .Преимущество использования одного из этих Dockerfiles заключается в том, что вы точно знаете, какую версию Ruby вы получаете, и она не меняется.

...