Как получить доступ к серверу dockerized rails с помощью «localhost»

#ruby-on-rails #ubuntu

#ruby-on-rails #ubuntu

Вопрос:

Я не часто играю с Docker, поэтому я действительно в замешательстве.

Вот мой Dockerfile :

 ARG RUBY_VERSION
FROM ruby:${RUBY_VERSION}-slim-buster

ARG PG_MAJOR
ARG NODE_MAJOR
ARG BUNDLER_VERSION
ARG YARN_VERSION

# common dependencies
RUN apt-get update -qq 
  amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends 
    build-essential 
    gnupg2 
    curl 
    less 
    git 
  amp;amp; apt-get clean 
  amp;amp; rm -fr /var/cache/apt/archives/* 
  amp;amp; rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/* 
  amp;amp; truncate -s 0 /var/log/*log

# add postgresql to sources list
RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - 
  amp;amp; echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list

# add nodejs to sources list
RUN curl -sL https://deb.nodesource.com/setup_$NODE_MAJOR.x | bash -

# add yarn to sources list
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - 
  amp;amp; echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

# application dependencies
# we use an external aptfile for that
COPY Aptfile /tmp/Aptfile
RUN apt-get update -qq amp;amp; DEBIAN_FRONTEND=noninteractive apt-get -yq dist-upgrade amp;amp; 
  DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends 
  libpq-dev 
  postgresql-client-$PG_MAJOR 
  nodejs 
  yarn=$YARN_VERSION-1 
  $(cat /tmp/Aptfile | xargs) amp;amp; 
  apt-get clean amp;amp; 
  rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/* amp;amp; 
  truncate -s 0 /var/log/*log

# configure bundler

ENV LANG=C.UTF-8 
  BUNDLE_JOBS=4 
  BUNDLE_RETRY=3

# upgrade rubygems and install required bundler version
RUN gem update --system amp;amp; 
  gem install bundler:${BUNDLER_VERSION}

# create a directory for the app code
RUN mkdir -p /app

WORKDIR /app
 

И вот мой docker-compose.yml :

 version: '3.8'

services:
  app: amp;app
    build:
      context: .dockerdev
      dockerfile: Dockerfile
      args:
        BUNDLER_VERSION: '2.1.4'
        NODE_MAJOR: '11'
        PG_MAJOR: '13'
        RUBY_VERSION: '2.7.2'
        YARN_VERSION: '1.22.5'
    image: example-dev:1.0.0
    tmpfs: 
      - /tmp

  backend: amp;backend
    <<: *app
    stdin_open: true
    tty: true
    volumes:
      - .:/app:cached
      - rails_cache:/app/tmp/cache
      - bundle:/usr/local/bundle
      - node_modules:/app/node_modules
      - packs:/app/public/packs
      - .dockerdev/.psqlrc:/root/.psqlrc:ro
    environment: 
      - NODE_ENV=development
      - RAILS_ENV=${RAILS_ENV:-development}
      - REDIS_URL=redis://redis:6379/
      - DATABASE_URL=postgres://postgres:postgres@postgres:5432
      - BOOTSNAP_CACHE_DIR=/usr/local/bundle/_bootsnap
      - WEBPACKER_DEV_SERVER_HOST=webpacker
      - HISTFILE=/app/log/.bash_history
      - PSQL_HISTFILE=/app/log/.psql_history
      - EDITOR=vi
      - MALLOC_ARENA_MAX=2
      - WEB_CONCURRENCY=${WEB_CONCURRENCY:-1}
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy

  runner:
    <<: *backend
    command: /bin/bash
    ports:
      - '3000:3000'
      - '3002:3002'

  rails:
    <<: *backend
    command: bundle exec rails server -b 0.0.0.0
    ports:
      - '3000:3000'

  sidekiq:
    <<: *backend
    command: bundle exec sidekiq -C configs/sidekiq.yml

  postgres:
    image: postgres:13.1
    volumes:
      - .psqlrc:/root/.psqlrc:ro
      - postgres:/var/lib/postgresql/data
      - ./log:/root/log:cached
      - ./.dockerdev/init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - PSQL_HISTFILE=/root/log/.psql_history
      - POSTGRES_PASSWORD=postgres
    ports:
      - 5432
    healthcheck:
      test: pg_isready -U postgres -h 127.0.0.1
      interval: 5s

  redis:
    image: redis:5.0-alpine
    volumes:
      - redis:/data
    ports:
      - 6379
    healthcheck:
      test: redis-cli ping
      interval: 1s
      timeout: 3s
      retries: 30
  
  webpacker:
    <<: *app
    command: ./bin/webpack-dev-server
    ports:
      - '3035:3035'
    volumes:
      - .:/app:cached
      - bundle:/usr/local/bundle
      - node_modules:/app/node_modules
      - packs:/app/public/packs
    environment:
      - NODE_ENV=${NODE_ENV:-development}
      - RAILS_ENV={RAILS_ENV:-development}
      - WEBPACKER_DEV_SERVER_HOST=0.0.0.0

volumes:
  postgres:
  redis:
  bundle:
  node_modules:
  rails_cache:
  packs:
 

Все работает просто отлично, я могу запускать свои runner , устанавливать драгоценные камни, играть с БД, запускать rails и т. Д.

Пока я не попытаюсь достичь http://localhost:3000 , который показывает только:

Этот сайт недоступен
, локальный хост отказался подключаться.

Вот шаг, который я делаю для запуска rails server:

 $ docker-compose run --rm rails
Creating okamii-saas_rails_run ... done
=> Booting Puma
=> Rails 6.0.3.4 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.6 (ruby 2.7.2-p137), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
 

And here is the result of docker-compose ps :

                Name                             Command                  State                Ports
------------------------------------------------------------------------------------------------------------
okamii-saas_postgres_1               docker-entrypoint.sh postgres    Up (healthy)   0.0.0.0:32789->5432/tcp
okamii-saas_rails_run_6fff67202995   bundle exec rails server - ...   Up
okamii-saas_redis_1                  docker-entrypoint.sh redis ...   Up (healthy)   0.0.0.0:32788->6379/tcp
 

У меня такое ощущение, что тот факт, что в Ports столбце for ничего не отображается okamii-saas_rails_run_6fff67202995 , является признаком того, что что-то не так, но я не знаю, почему оно пустое и что я должен здесь делать. (см. РЕДАКТИРОВАНИЕ 1)

Как примечание, я знаю, что название говорит how to using localhost , но я действительно не могу получить к нему доступ вообще AFAIK 🙂

===

РЕДАКТИРОВАТЬ 1:

Это не совсем так. Я подумал, что, добавив EXPOSE 3000 в my Dockerfile , docker-compose ps что-то покажет в столбце Ports для моего контейнера, но это ничего не изменило.

Вот обновленный вид docker-composer ps при использовании EXPOSE 3000 :

                Name                             Command                  State                Ports
------------------------------------------------------------------------------------------------------------
okamii-paas_postgres_1               docker-entrypoint.sh postgres    Up (healthy)   0.0.0.0:32771->5432/tcp
okamii-paas_rails_run_d812907346b4   bundle exec rails server - ...   Up             3000/tcp
okamii-paas_redis_1                  docker-entrypoint.sh redis ...   Up (healthy)   0.0.0.0:32770->6379/tcp
 

РЕДАКТИРОВАТЬ 2:

Из того, что я могу прочитать в документе EXPOSE , он действует только как документация. Он больше ничего не делает, что объясняет, почему его использование ничего не меняет.

РЕДАКТИРОВАТЬ 3:

Я просто попытался запустить docker-compose up -d rails вместо docker-compose run rails и это сообщение начало появляться:

 $ dc up -d rails
Creating network "okamii-paas_default" with the default driver
Creating okamii-paas_postgres_1 ... done
Creating okamii-paas_redis_1    ... done
Creating okamii-paas_rails_1    ...
Creating okamii-paas_rails_1    ... error

ERROR: for okamii-paas_rails_1  Cannot start service rails: driver failed programming external connectivity on endpoint okamii-paas_rails_1 (5d07dfedfc5c979133ce61a237327edb149a0a6793a85f61f6ad8218a60a510b): Bind for 0.0.0.0:3000 failed: port is already allocated

ERROR: for rails  Cannot start service rails: driver failed programming external connectivity on endpoint okamii-paas_rails_1 (5d07dfedfc5c979133ce61a237327edb149a0a6793a85f61f6ad8218a60a510b): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
 

Я не понимаю, откуда возникает конфликт.

После предложения @dbugger я изменил публикацию портов с "3000:3000" на "3000" . И теперь в Ports столбце отображаются данные, но, конечно, отображение неверно.

          Name                       Command                  State                Ports
------------------------------------------------------------------------------------------------
okamii-paas_postgres_1   docker-entrypoint.sh postgres    Up (healthy)   0.0.0.0:32784->5432/tcp
okamii-paas_rails_1      bundle exec rails server - ...   Up             0.0.0.0:32786->3000/tcp
okamii-paas_redis_1      docker-entrypoint.sh redis ...   Up (healthy)   0.0.0.0:32785->6379/tcp
 

Комментарии:

1. В конце вашего dockerfile попробуйте добавить команду EXPOSE 3000

2. @dbugger Я попробовал это один раз, и, за исключением изменения результата docker-compose ps , я все еще не могу получить доступ localhost:3000 . Я обновил свой пост, если вы хотите посмотреть, как он выглядит.

3. По какой-либо причине у вас тоже работает runner на порту 3000?

4. Следующее, что я бы изменил, — это изменение конфигурации портов для rails с 3000: 3000 на 3000

5. Что касается runner и его портов, я не могу вспомнить. Но поскольку я его не запускаю, он не конфликтует. Хотя, просто ради тестирования, я удалил их, я все перезапустил, но безуспешно. Я попытался настроить порты, как вы предложили, и это ничего не меняет.