Команда `rails s -p` не перехватывается докером - PullRequest
0 голосов
/ 26 декабря 2018

У меня небольшой проект с одним сервисом, который является API-интерфейсом rails :.Контейнер, удерживающий API-интерфейс rails, не работает так, как мне бы хотелось.

Вот мой 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 голосов
/ 28 декабря 2018

Во-первых, вы можете изменить 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:

Binds Rails to the specified IP - defaults to 'localhost' in development 
and '0.0.0.0' in other environments'

Вы обнаружите, что вам нужно указать этот флаг, когда выиспользование Docker-контейнеров (по крайней мере, в разработке) или запуск виртуальной машины (Virtualbox или других).

0 голосов
/ 28 декабря 2018

Другим решением будет изменение порта по умолчанию в вашем файле config/puma.rb.

ENV.fetch("PORT") { 3001 }

Таким образом, вы можете использовать следующую команду в вашем Dockerfile

CMD ["bundle", "exec", "rails", "server"]
0 голосов
/ 26 декабря 2018

По умолчанию контейнер рельсов Docker работает на порту 3000.Если вы хотите работать с другим портом, чем вам нужно сопоставить внутренний порт контейнера с внешним приложением.Вот так:

ports:
 - '3001:3000'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...