#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
и его портов, я не могу вспомнить. Но поскольку я его не запускаю, он не конфликтует. Хотя, просто ради тестирования, я удалил их, я все перезапустил, но безуспешно. Я попытался настроить порты, как вы предложили, и это ничего не меняет.