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).
vi consiglio --host ::, che legherà a tutti IPv4 * e * indirizzi IPv6. – odigity
@odigity puoi spiegarlo? –
È 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