如何使用 Docker 和 docker-compose 运行 访问 Sinatra 端口
How to access Sinatra port using Docker with docker-compose run
我不确定如何正确地将 Sinatra 端口 4567
从 Docker 公开回主机。 运行本地应用没有问题。
以下存储库显示了问题 https://gitlab.com/davidhooey/sinatra-docker
通过搜索,我注意到以下问题 ,其中 --host 0.0.0.0
被传递到 rackup
命令中。但是,我通过使用 Site.run!
.
以编程方式启动网站
文件树
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── app.rb
├── docker-compose.yml
├── site.rb
└── views
└── index.erb
app.rb
module App
class App
def initialize(args)
# Do some stuff before launching site.
# Launch site
Site.run!
end
end
end
App::App.new(ARGV)
在 site.rb
中,:bind
Sinatra 设置设置为 0.0.0.0
。
site.rb
require 'sinatra'
module App
class Site < Sinatra::Base
set :bind, '0.0.0.0'
set :static, true
set :public_dir, File.expand_path(__dir__)
get '/' do
erb :'/index'
end
end
end
当 运行 在 Docker 容器中时,即使该站点仍然无法访问。
Dockfile
FROM ruby:2.2.6
EXPOSE 4567
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN gem install bundler && bundle install
CMD ["/bin/bash"]
docker-compose.yml
version: '3.2'
services:
app:
build: .
hostname: app
ports:
- "4567:4567"
environment:
- RUBYOPT=-W0 -KU -E utf-8:utf-8
volumes:
- type: bind
source: .
target: /app
本地作品:
ruby app.rb
Docker没那么多:
docker-compose build
docker-compose run --rm app ruby app.rb
Docker 运行 示例。
$ docker-compose run --rm app ruby app.rb
[2018-07-27 14:21:10] INFO WEBrick 1.3.1
[2018-07-27 14:21:10] INFO ruby 2.2.6 (2016-11-15) [x86_64-linux]
== Sinatra (v2.0.3) has taken the stage on 4567 for development with backup from WEBrick
[2018-07-27 14:21:10] INFO WEBrick::HTTPServer#start: pid=1 port=4567
在 运行ning 容器中启动 bash shell 以访问容器内的 Sinatra。
$ docker exec -it aa8f64b009b0 bash
root@app:/app# curl localhost:4567
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sinatra Docker</title>
</head>
<body>
<h1>Sinatra Docker</h1>
</body>
</html>
root@app:/app#
欢迎任何关于如何在以编程方式启动 Sinatra 时从本地主机访问容器内的 Sinatra 端口 运行 的想法。
当 运行使用 docker-compose run
连接应用程序时,服务端口将 不映射 。这是设计使然,因为 run
用于一次性任务,而不是用于启动整个组合堆栈。
在此处查看文档:
https://docs.docker.com/compose/reference/run/
The second difference is that the docker-compose run command does not create any of the ports specified in the service configuration. This prevents port collisions with already-open ports.
要映射端口,您需要使用 run
和 --service-ports
,或者将 command
部分添加到 docker-compose.yml
,然后使用 docker-compose up
:
选项 1(使用 运行):
docker-compose run --service-ports --rm app ruby app.rb -o 0.0.0.0
选项 2(启动整个堆栈):
services:
app:
build: .
hostname: app
command: ruby app.rb -o 0.0.0.0 # <-- Add this
ports:
- "4567:4567"
...
然后:
docker-compose up
我不确定如何正确地将 Sinatra 端口 4567
从 Docker 公开回主机。 运行本地应用没有问题。
以下存储库显示了问题 https://gitlab.com/davidhooey/sinatra-docker
通过搜索,我注意到以下问题 --host 0.0.0.0
被传递到 rackup
命令中。但是,我通过使用 Site.run!
.
文件树
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── app.rb
├── docker-compose.yml
├── site.rb
└── views
└── index.erb
app.rb
module App
class App
def initialize(args)
# Do some stuff before launching site.
# Launch site
Site.run!
end
end
end
App::App.new(ARGV)
在 site.rb
中,:bind
Sinatra 设置设置为 0.0.0.0
。
site.rb
require 'sinatra'
module App
class Site < Sinatra::Base
set :bind, '0.0.0.0'
set :static, true
set :public_dir, File.expand_path(__dir__)
get '/' do
erb :'/index'
end
end
end
当 运行 在 Docker 容器中时,即使该站点仍然无法访问。
Dockfile
FROM ruby:2.2.6
EXPOSE 4567
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN gem install bundler && bundle install
CMD ["/bin/bash"]
docker-compose.yml
version: '3.2'
services:
app:
build: .
hostname: app
ports:
- "4567:4567"
environment:
- RUBYOPT=-W0 -KU -E utf-8:utf-8
volumes:
- type: bind
source: .
target: /app
本地作品:
ruby app.rb
Docker没那么多:
docker-compose build
docker-compose run --rm app ruby app.rb
Docker 运行 示例。
$ docker-compose run --rm app ruby app.rb
[2018-07-27 14:21:10] INFO WEBrick 1.3.1
[2018-07-27 14:21:10] INFO ruby 2.2.6 (2016-11-15) [x86_64-linux]
== Sinatra (v2.0.3) has taken the stage on 4567 for development with backup from WEBrick
[2018-07-27 14:21:10] INFO WEBrick::HTTPServer#start: pid=1 port=4567
在 运行ning 容器中启动 bash shell 以访问容器内的 Sinatra。
$ docker exec -it aa8f64b009b0 bash
root@app:/app# curl localhost:4567
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sinatra Docker</title>
</head>
<body>
<h1>Sinatra Docker</h1>
</body>
</html>
root@app:/app#
欢迎任何关于如何在以编程方式启动 Sinatra 时从本地主机访问容器内的 Sinatra 端口 运行 的想法。
当 运行使用 docker-compose run
连接应用程序时,服务端口将 不映射 。这是设计使然,因为 run
用于一次性任务,而不是用于启动整个组合堆栈。
在此处查看文档:
https://docs.docker.com/compose/reference/run/
The second difference is that the docker-compose run command does not create any of the ports specified in the service configuration. This prevents port collisions with already-open ports.
要映射端口,您需要使用 run
和 --service-ports
,或者将 command
部分添加到 docker-compose.yml
,然后使用 docker-compose up
:
选项 1(使用 运行):
docker-compose run --service-ports --rm app ruby app.rb -o 0.0.0.0
选项 2(启动整个堆栈):
services:
app:
build: .
hostname: app
command: ruby app.rb -o 0.0.0.0 # <-- Add this
ports:
- "4567:4567"
...
然后:
docker-compose up