运行 Ruby Docker 容器内的 Sinatra 无法连接(通过 Mac 主机)或无法找到命令(在不同情况下)?
Running Ruby Sinatra inside a Docker container not able to connect (via Mac host) or find commands (in different scenario)?
我已经尝试了两种形式的 Dockerfile 来获得一个简单的 Ruby/Sinatra 应用程序 运行ning,并且在这两种情况下它都因不同的原因而失败(我将解释两者稍后)。
实际上我想从我的主机访问 Sinatra 网络服务器(Mac OS X 使用 Boot2Docker)。
应用结构是:
.
├── Dockerfile
├── Gemfile
├── app.rb
├── config.ru
文件内容为:
Docker文件
版本 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"]
版本 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
我这样构建 docker 图像:
docker build --rm -t ruby_app .
我运行容器是这样的:
docker run -d -p 7080:5000 ruby_app
然后我尝试验证我可以连接到 运行ning 服务(在我的 Mac 上使用 Boot2Docker),如下所示:
curl $(boot2docker ip):7080
使用 Docker 文件的版本 1,在 能够 运行 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",'
对于 Docker 文件的版本 2,它似乎 运行 机架服务器从容器内部运行正常,但我无法通过主机环境连接,所以当 运行 宁 curl 命令我得到错误:
curl: (7) Failed to connect to 192.168.59.103 port 7080: Connection refused
有人知道我遗漏了什么吗?似乎在 Docker 容器中获得一个非常简单的 Ruby/Sinatra 应用程序 运行ning 应该不难,我可以从中通过我的主机访问(Mac OS X 通过 Boot2Docker).
更改 dockerfile 以改用它:
["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "5000"]
我已经尝试了两种形式的 Dockerfile 来获得一个简单的 Ruby/Sinatra 应用程序 运行ning,并且在这两种情况下它都因不同的原因而失败(我将解释两者稍后)。
实际上我想从我的主机访问 Sinatra 网络服务器(Mac OS X 使用 Boot2Docker)。
应用结构是:
.
├── Dockerfile
├── Gemfile
├── app.rb
├── config.ru
文件内容为:
Docker文件
版本 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"]
版本 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
我这样构建 docker 图像:
docker build --rm -t ruby_app .
我运行容器是这样的:
docker run -d -p 7080:5000 ruby_app
然后我尝试验证我可以连接到 运行ning 服务(在我的 Mac 上使用 Boot2Docker),如下所示:
curl $(boot2docker ip):7080
使用 Docker 文件的版本 1,在 能够 运行 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",'
对于 Docker 文件的版本 2,它似乎 运行 机架服务器从容器内部运行正常,但我无法通过主机环境连接,所以当 运行 宁 curl 命令我得到错误:
curl: (7) Failed to connect to 192.168.59.103 port 7080: Connection refused
有人知道我遗漏了什么吗?似乎在 Docker 容器中获得一个非常简单的 Ruby/Sinatra 应用程序 运行ning 应该不难,我可以从中通过我的主机访问(Mac OS X 通过 Boot2Docker).
更改 dockerfile 以改用它:
["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "5000"]