2015-05-04 18 views
5

Tôi đã thử hai dạng Dockerfile để chạy ứng dụng Ruby/Sinatra đơn giản, và trong cả hai trường hợp, nó không thành công vì các lý do khác nhau (tôi sẽ giải thích cả trong một thời điểm).Chạy Ruby Sinatra bên trong vùng chứa Docker không thể kết nối (qua máy Mac) hoặc tìm lệnh (trong kịch bản khác)?

Có hiệu quả tôi muốn truy cập máy chủ web Sinatra từ máy chủ của tôi (Mac OS X sử dụng Boot2Docker).

Cấu trúc ứng dụng là:

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

Nội dung của các tập tin bao gồm:

Dockerfile

Phiên bản 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"] 

Phiên bản 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 

tôi xây dựng hình ảnh Docker như vậy:

docker build --rm -t ruby_app .

tôi chạy container như vậy:

docker run -d -p 7080:5000 ruby_app

sau đó tôi cố gắng xác minh tôi có thể kết nối với các dịch vụ đang chạy (trên máy Mac của tôi sử dụng Boot2Docker) như sau:

curl $(boot2docker ip):7080

Với phiên bản 1 o f các Dockerfile tôi nhận được lỗi sau trước có khả năng chạy lệnh curl:

/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",' 

Với phiên bản 2 của Dockerfile nó có vẻ chạy tốt máy chủ rack từ bên trong container nhưng tôi không thể kết nối thông qua các môi trường máy chủ và vì thế khi chạy lệnh curl tôi nhận được lỗi:

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

có ai có bất kỳ ý tưởng như những gì tôi đang thiếu? Dường như nó không phải là khó khăn để có được một ứng dụng Ruby/Sinatra rất đơn giản chạy bên trong một container Docker mà từ đó tôi có thể truy cập thông qua máy chủ của tôi (Mac OS X thông qua Boot2Docker).

Trả lời

8

Thay đổi dockerfile sử dụng điều này thay vì:

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

Tôi khuyên bạn nên --host ::, mà sẽ liên kết với tất cả IPv4 * và * địa chỉ IPv6. – odigity

+0

@ tính xác thực, bạn có thể giải thích điều đó không? –

+0

Đó là phiên bản IPv6 của 0.0.0.0, là phiên bản IPv4 của câu nói "liên kết với tất cả các địa chỉ có sẵn". Dưới đây là một câu hỏi SX khác nói về nó: http://serverfault.com/questions/444554/what-does-mean-as-an-ip-address-bracket-colon-colon-bracket – odigity

Các vấn đề liên quan