2016-10-14 3 views
1

Ich habe eine Dockerfile, die einen Ruby on Rails-Stack definiert. HierLinux-Quellbefehl funktioniert nicht beim Erstellen von Dockerfile

ist die Dockerfile:

FROM ubuntu:14.04 
MAINTAINER example <[email protected]> 

# Update 
RUN apt-get update 

# Install Ruby and Rails dependencies 
RUN apt-get install -y \ 
ruby \ 
ruby-dev \ 
build-essential \ 
libxml2-dev \ 
libxslt1-dev \ 
zlib1g-dev \ 
libsqlite3-dev \ 
nodejs \ 
curl 

RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 

RUN curl -sSL https://get.rvm.io | bash -s stable --rails 

RUN /bin/bash -c "source /usr/local/rvm/scripts/rvm" 

# Install Rails 
RUN gem install rails 

# Create a new Rails app under /src/my-app 
RUN mkdir -p /src/new-app 

RUN rails new /src/new-app 

WORKDIR /src/my-app 

# Default command is to run a rails server on port 3000 
CMD ["rails", "server", "--binding", "0.0.0.0", "--port" ,"3000"] 

EXPOSE 3000 

Wenn ich den Befehl docker build -t anotherapp/my-rails-app . ich die folgende Fehlermeldung aus:

Removing intermediate container 3f8060cdc6f5
Step 8 : RUN gem install rails
---> Running in 8c1793414e63
ERROR: Error installing rails:
activesupport requires Ruby version >= 2.2.2.
The command '/bin/sh -c gem install rails' returned a non-zero code: 1

Es sieht aus wie der Befehl source /usr/local/rvm/scripts/rvm nicht während des Build arbeiten.

Ich bin mir nicht sicher, warum genau das passiert.

+2

Der Befehl funktioniert, aber wenn der Befehl beendet ist, wird die Shell beendet und alles ist wieder verschwunden. – tkausl

+3

sollten Sie vielleicht rvm nicht verwenden, um Schienen zu installieren, aber wenn Sie möchten, sollten Sie alle 'RUN's verketten, da jeder von ihnen eine neue Schicht erstellt und wahrscheinlich Ihre Bash-Quelle nicht kennt – bjhaid

+0

Haben Sie diese Antwort http gelesen: //stackoverflow.com/a/25685004/1981061? – Griffin

Antwort

6

Von der docker builder reference wird jeder RUN-Befehl unabhängig ausgeführt. So hat RUN source /usr/local/rvm/scripts/rvm keinen Effekt auf den nächsten RUN-Befehl.

Versuchen Sie, die Operationen zu ändern, die die angegebenen Quelldatei benötigen als

RUN /bin/bash -c "source /usr/local/rvm/scripts/rvm ; gem install rails" 
1

folgt dies nicht direkt Ihre Frage beantworten, aber es ist eine andere Möglichkeit, das Problem zu nähern.

Docker bietet eine officialRuby image. Dies ist das Bild, das Docker Compose and Rails Quickstart Tutorial verwendet. Wie Sie an ihrem Beispiel (unten) sehen können, können Sie Gemfile.lock in Ihr Image kopieren und bundle install ausführen, ohne sich um RVM Gedanken machen zu müssen.

FROM ruby:2.2.0 
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs 
RUN mkdir /myapp 
WORKDIR /myapp 
ADD Gemfile /myapp/Gemfile 
ADD Gemfile.lock /myapp/Gemfile.lock 
RUN bundle install 
ADD . /myapp 

Sie werden in der Regel nur eine haben Rails-Anwendung in einem Container ausgeführt wird unter Verwendung einer bestimmten Version von Ruby so RVM die Fähigkeit, mehrere Version von Ruby verwalten wird nicht hilfreich sein. Wenn Sie neugierig sind, wie die offiziellen Bilder gemacht werden, ist das Dockerfile auf Github.


Warum dies geschieht. Wie andere darauf hingewiesen haben, führt der Befehl source die Datei in der aktuellen Shell aus. Jede Anweisung RUN

... will execute any commands in a new layer on top of the current image and commit the results. The resulting committed image will be used for the next step in the Dockerfile.

Jede RUN, ADD, COPY Anweisung beginnt im Wesentlichen eine neue Schale in einen neuen Behälter und führt einen Befehl.

1 RUN /bin/bash -c "source /usr/local/rvm/scripts/rvm" 
2 RUN gem install rails 

Kann als

1 Start a brand new shell 
    Execute: source /usr/local/rvm/scripts/rvm 
    Save the state of the file system as an image 
    Exit shell 

2 Start a brand new shell 
    Execute: gem install rails 
    ... 

Wenn Schritt 1 abgeschlossen ist, die Schale (und alles, was Ihr in sie sourced) gelesen werden, geht weg.

Verwandte Themen