2015-05-04 20 views
5

Ho provato due forme di Dockerfile per far funzionare una semplice app Ruby/Sinatra, e in entrambi gli scenari fallisce per motivi diversi (spiegherò entrambi in un attimo).Esecuzione di Ruby Sinatra all'interno di un contenitore Docker non è in grado di connettersi (tramite host Mac) o di trovare comandi (in scenari diversi)?

Effettivamente voglio accedere al server Web Sinatra dal mio host (Mac OS X utilizzando Boot2Docker).

La struttura app è:

. 
├── Dockerfile 
├── Gemfile 
├── app.rb 
├── config.ru 

Il contenuto dei file sono:

Dockerfile

versione 1 ...

FROM ruby 
RUN mkdir -p /app 
WORKDIR /app 
COPY Gemfile /app/ 
RUN bundle install --quiet 
COPY . /app 
EXPOSE 5000 
ENTRYPOINT ["bash"] 
CMD ["bundle", "exec", "rackup", "-p", "5000"] 

versione 2 ..

FROM ubuntu:latest 

RUN apt-get -qq update 
RUN apt-get -qqy install ruby ruby-dev 
RUN apt-get -qqy install libreadline-dev libssl-dev zlib1g-dev build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev 
RUN gem install bundler 

RUN mkdir -p /app 
WORKDIR /app 
COPY Gemfile /app/ 
RUN bundle install --quiet 
COPY . /app 
EXPOSE 5000 
CMD ["bundle", "exec", "rackup", "-p", "5000"] 

Gemfile

source "https://rubygems.org/" 

gem "puma" 
gem "sinatra" 

app.rb

require "sinatra/base" 

class App < Sinatra::Base 
    set :bind, "0.0.0.0" 

    get "/" do 
    "<p>hello world</p>" 
    end 
end 

config.ru

require "sinatra" 
require "./app.rb" 

run App 

Ho costruire l'immagine finestra mobile in questo modo:

docker build --rm -t ruby_app .

corro il contenitore in questo modo:

docker run -d -p 7080:5000 ruby_app

Allora provo a verificare che è possibile connettersi al servizio in esecuzione (sul mio Mac utilizzando Boot2Docker) in questo modo:

curl $(boot2docker ip):7080

Con la versione 1 o f il Dockerfile ottengo il seguente errore prima essere in grado di eseguire il comando ricciolo:

/usr/local/bundle/bin/rackup: line 9: require: command not found 
/usr/local/bundle/bin/rackup: rackup: line 10: syntax error near unexpected token `(' 
/usr/local/bundle/bin/rackup: rackup: line 10: `ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../../../../app/Gemfile",' 

Con la versione 2 del Dockerfile sembra funzionare la multa server rack dall'interno del contenitore, ma io sono in grado di collego via l'ambiente host e così quando l'esecuzione del comando ricciolo ottengo l'errore:

curl: (7) Failed to connect to 192.168.59.103 port 7080: Connection refused

qualcuno ha qualche idea di ciò che mi manca? Sembra che non dovrebbe essere così difficile ottenere un'app Ruby/Sinatra molto semplice in esecuzione all'interno di un contenitore Docker da cui posso accedere tramite il mio host (Mac OS X tramite Boot2Docker).

risposta

8

Modificare il dockerfile utilizzare questo invece:

["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "5000"] 
+0

vi consiglio --host ::, che legherà a tutti IPv4 * e * indirizzi IPv6. – odigity

+0

@odigity puoi spiegarlo? –

+0

È la versione IPv6 di 0.0.0.0, che è la versione IPv4 di "collegamento a tutti gli indirizzi disponibili". Ecco un'altra domanda SX che ne parla: http://serverfault.com/questions/444554/what-does-mean-as-an-ip-ad-ress-bracket-colon-colon-bracket – odigity