Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Nginx似乎在Docker中的Sinatra应用程序上崩溃_Ruby_Bash_Nginx_Docker_Sinatra - Fatal编程技术网

Ruby Nginx似乎在Docker中的Sinatra应用程序上崩溃

Ruby Nginx似乎在Docker中的Sinatra应用程序上崩溃,ruby,bash,nginx,docker,sinatra,Ruby,Bash,Nginx,Docker,Sinatra,Dockerfile: FROM ruby:2.3.1-slim MAINTAINER Marc Lacoursiere <marc@roosoft.com> RUN apt-get update && apt-get install -yq nginx RUN rm /etc/nginx/sites-enabled/default ADD docker/sinatra.conf /etc/nginx/sites-enabled/sinatra.conf RUN

Dockerfile:

FROM ruby:2.3.1-slim
MAINTAINER Marc Lacoursiere <marc@roosoft.com>

RUN apt-get update && apt-get install -yq nginx

RUN rm /etc/nginx/sites-enabled/default
ADD docker/sinatra.conf /etc/nginx/sites-enabled/sinatra.conf

RUN adduser app --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
RUN mkdir /home/app/webapp

WORKDIR /tmp
COPY app/Gemfile /tmp/
COPY app/Gemfile.lock /tmp/
RUN bundle install

COPY app /home/app/webapp
RUN chown -R app:app /home/app

CMD ["nginx", "-g", "daemon off;"]
CMD ["ruby", "/home/app/webapp/app.rb"]
app.rb

require 'sinatra'
require 'sinatra/json'

set :port, 4000

get '/' do
  json 'Hello World!'
end
档案:

source 'https://rubygems.org'

gem 'sinatra', '1.4.6'
gem 'sinatra-contrib', '~> 1.4.2'
它是如何在bash中执行的

docker run -p 4444:80 roosoft/sinatra-example
简单地说,我应该得到一个sinatra应用程序来回答集装箱的端口4000。Nginx正在侦听容器的端口80,并返回在端口4000(即sinatra应用程序)上找到的内容。容器的端口80重定向到本地端口4444。但4444端口返回:

curl: (52) Empty reply from server
此时,出于某种模糊的原因,nginx没有在容器中运行。要修复它,我只需登录到容器中,键入
service nginx start
,一切正常。我可以从容器中注销,本地端口4444返回预期的结果

如果我注释掉最后一行Dockerfile,重建并重新启动容器,那么容器的端口4000中没有运行sinatra应用程序,但这次nginx正在运行!好像nginx在我运行sinatra时被杀了


我做错了什么?我显然希望两者同时运行…

在一个Dockerfile()中不能有多个
CMD
语句。如果查看
docker build
的输出,可以看到每个
CMD
都会创建一个新图像。每个
CMD
都会覆盖上一个图像中指定的内容

如果要在Docker容器中运行多个进程,可以使用类似的进程管理器。supervisord还帮助您在出现故障时自动重新启动进程。有关如何执行此操作的教程可在此处找到:


另一个(更干净的)解决方案是启动两个容器。一个用于Sinatra应用程序,一个用于Nginx。只需将两个容器链接在一起(
docker create--link…
)或设置一个网络(
docker network create…
)并将两个容器连接到它(
docker create--network…
)。

是的,开始理解docker是关于单进程应用程序的。因此,运行sinatra应用程序似乎是容器的完整用例。我正在考虑在服务器上运行nginx。
curl: (52) Empty reply from server