docker未捕获`rails s -p`命令

时间:2018-12-26 16:35:48

标签: ruby-on-rails docker docker-compose

我有一个带有Rails API的服务的小项目:装有rails API的容器行为不如我所愿。

这是我的docker-compose.yml

version: '3'

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

以下是服务的Dockerfile

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 [“ bundle”,“ exec”,“ rails”,“ server”,“-p”,“ 3001”])由

CMD ["bundle", "exec", "rails", "server"]

默认情况下会在端口3000上发出。然后在docker-compose.yml中,将计算机上的端口3001映射到容器中的端口3000。

version: '3'

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

找到该作品。为什么第一个版本不起作用?

编辑:这是telnet提供的内容

-> % telnet localhost 3001
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

3 个答案:

答案 0 :(得分:1)

首先,您可以按如下所示修改fun CardView.expand() { val initialHeight = height measure(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT) val targetHeight = measuredHeight // And so on from previous snippet } ,以在屏幕上查看服务器输出:

docker-compose.yml

您还应该尝试如下修改version: '3' services: mynab_api: image: 'myname/my_api:latest' ports: - '3001:3001' tty: true 中的CMD

Dockerfile

如果运行CMD ["bundle", "exec", "rails", "server", "-p", "3001", "-b", "0.0.0.0"] ,则会看到rails server --help标志的以下内容:

--binding

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

答案 1 :(得分:0)

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

ports:
 - '3001:3000'

答案 2 :(得分:0)

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

ENV.fetch("PORT") { 3001 }

这样,您可以在Dockerfile

中使用以下命令
CMD ["bundle", "exec", "rails", "server"]