首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘docker未捕获到`rails的-p`命令

问‘docker未捕获到`rails的-p`命令
EN

Stack Overflow用户
提问于 2018-12-27 00:35:48
回答 3查看 338关注 0票数 1

我有一个小项目,有一个服务,这是一个rails API:。保存rails API的容器并没有像我希望的那样运行。

这是我的docker-compose.yml

代码语言:javascript
复制
version: '3'

services:
  mynab_api:
    image: 'myname/my_api:latest'
    ports:
      - '3001:3001'

以下是该服务的Dockerfile:

代码语言:javascript
复制
FROM ruby:2.5.3-alpine3.8

# Minimal requirements to run a Rails app
RUN apk add --no-cache --update build-base \
                                linux-headers \
                                git \
                                sqlite-dev \
                                nodejs \
                                tzdata

ENV APP_PATH /usr/src/app

# Different layer for gems installation
WORKDIR $APP_PATH
ADD Gemfile $APP_PATH
ADD Gemfile.lock $APP_PATH
RUN bundle install

# Copy the application into the container
COPY . $APP_PATH

CMD ["bundle", "exec", "rails", "server", "-p", "3001"]

当我运行$ docker-compose up时,服务启动并且没有崩溃。如果我运行$ docker-compose ps,服务就启动了。问题是,如果我进入浏览器访问http://localhost:3001,服务似乎关闭了(尽管仍在运行)。

我发现的一个修复方法是将Dockerfile (CMD“捆绑包”、"exec“、"rails”、"server“、"-p”、"3001")中的默认命令替换为

代码语言:javascript
复制
CMD ["bundle", "exec", "rails", "server"]

它默认在端口3000上发出。然后在docker-compose.yml中,我将机器上的端口3001映射到容器中的端口3000。

代码语言:javascript
复制
version: '3'

services:
  mynab_api:
    image: 'myname/my_api:latest'
    ports:
      - '3001:3000'

这个作品找到了。为什么第一个版本不能工作?

编辑:这是telnet提供的功能

代码语言:javascript
复制
-> % telnet localhost 3001
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-28 11:00:05

首先,您可以如下所示修改您的docker-compose.yml,以在屏幕上查看服务器输出:

代码语言:javascript
复制
version: '3'

services:
  mynab_api:
    image: 'myname/my_api:latest'
    ports:
      - '3001:3001'
    tty: true

您还应该尝试修改Dockerfile中的CMD,如下所示:

代码语言:javascript
复制
CMD ["bundle", "exec", "rails", "server", "-p", "3001", "-b", "0.0.0.0"]

如果您运行rails server --help,您将看到以下--binding标志:

代码语言:javascript
复制
Binds Rails to the specified IP - defaults to 'localhost' in development 
and '0.0.0.0' in other environments'

您会发现,在使用docker容器(至少在开发中)或运行虚拟机(Virtualbox或其他)时,需要指定此标志。

票数 2
EN

Stack Overflow用户

发布于 2018-12-27 01:03:43

默认情况下,rails docker容器在3000端口上运行。如果您想在不同的端口上运行,则需要将内部容器端口映射到外部应用程序。就像这样:

代码语言:javascript
复制
ports:
 - '3001:3000'
票数 0
EN

Stack Overflow用户

发布于 2018-12-28 18:09:58

另一种解决方案是修改config/puma.rb文件中的默认端口。

代码语言:javascript
复制
ENV.fetch("PORT") { 3001 }

这样,您就可以在Dockerfile中使用以下命令

代码语言:javascript
复制
CMD ["bundle", "exec", "rails", "server"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53934652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档