Введение

В последнем рассказе я показываю, как можно создать собственный образ rails 6 на Docker.

Еще одна вещь, которая вызывала у меня столько сомнений, когда я пытался использовать Rails с Docker, - это интеграция между приложением Rails 6 и базой данных Postgresql. Я потратил много времени на поиски способа сделать это БЕЗ ДОКЕРА КОМПОЗИЦИИ.

Но вы можете спросить меня: «Почему без docker compose?»

Ответ прост. Мне нравится учиться понимать, что я делаю. Используйте готовый образ или готовую компоновку докера, чтобы создать мой контейнер и вернуть мне мой настроенный проект, не позволяющий мне точно узнать, как работает докер.

Создание контейнера Postgres

Правильно. После этого небольшого объяснения перейдем к делу. Чтобы создать приложение Rails с postgresql, нам нужно открыть два контейнера докеров.

В первую очередь мы откроем контейнер postgresql. Чтобы использовать эту команду, вы должны находиться в отдельной папке, в которую вы хотите добавить свои файлы postgres.

docker run --name postgres -d -e POSTGRES_PASSWORD=password_postgres -v $(pwd):/var/lib/postgresql/data postgres
Explanation
docker run is a command used when you want to start up containers based on an image
--name postgres - define container's name (it's important to make link, I will explain after). In this case, container name is "postgres". If you don't set the name, docker will use a random funny name.
-d - create container on detach mode, this is make the container run in background
-e POSTGRES_PASSWORD=password_postgres - this flag set environment variables. In this case, the POSTGRES_PASSWORD is being set to "password_postgres"
-v $(pwd):/var/lib/postgresql/data - this flag bind mount a volume. $(pwd) is a variable use to references the actual directory. So, we are binding the actual directory in our computer to a directory in /var/lib/postgresql/data inside the container. Everything that is added or removed from any of this two directories will happen in the other too. It is a important step, because without this step, our container can be closed and all data in our database be lost.
postgres - it's the image name.

И он вернет идентификатор контейнера.

Сохраните этот идентификатор и перейдем к следующему шагу.

Создание контейнера Rails

Теперь нам нужно создать наш контейнер для рельсов. Чтобы использовать эту команду, вам также необходимо находиться в отдельной папке, но в этом случае в этой папке будут сохранены все ваши проекты Rails.

docker run -it -p 3000:3000 --link postgres:db -v $(pwd):/projects rails6
Explanation
I will only explain lines that I didn't explain yet.
docker run - already explained
-it - flags used when you need a container that need to be interactive, in other words, it enables you to use the terminal inside container
-p 3000:3000 - publish a container port to host. In this case, we are mapping the container's port 3000 to host computer's port 3000. This is, when we use port 3000 on container, the same output will be in host computer's port 3000.
--link postgres:db - this is the most important parameter to this post. Basically, this flag make a link between a existent container named postgres and map with a name (db) to our rails container.
-v $(pwd):/projects - In this case, you have to separate a directory to put your projects. This is a important way to code a project in your favorite text editor. You will need to open the project in your computer to edit it. And the project need to be acessible by the container to be executed.
rails6 - image name. In this case, I'm using the image created in the last story.

Выполнив эту команду, вы войдете в контейнерный терминал.

Теперь вам нужно войти в папку / projects внутри контейнера.

cd projects

И вы запустите новый проект Rails 6 с базой данных, настроенной на postgresql.

rails new project_name --database=postgresql
project_name can be changed by any valid name.

Rails инициализирует ваш проект. Этот шаг может занять некоторое время.

Вам нужно войти в папку проекта в вашем любимом текстовом редакторе, чтобы начать настройку базы данных.

cd project_name
project_name will be the name of your project

Настройка базы данных

Открыть конфиг ›database.yml

В части по умолчанию вы увидите что-то вроде этого:

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

И вам нужно добавить некоторую информацию для настройки базы данных:

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  username: postgres
  password: password_postgres
Explanation
host: db - host is the IP for your database. But in this case, we are using "db", because docker create this name, when we use --link in container creation.
username: postgres - username is your postgres username (by default it is "postgres")
password: password_postgres - password is your postgres password (the environment variable defined on container run)

Если все прошло правильно, при запуске вашего проекта в контейнере с «rails server -b 0.0.0.0».

Важно использовать «-b 0.0.0.0», потому что это правильный IP-адрес, по которому Docker устанавливает связь между портами.

Вы увидите что-то вроде этого:

Это ожидаемая ошибка, поскольку мы еще не создаем базу данных.

Создание базы данных postgres

Для этого нам нужно открыть контейнер postgres в другом терминале.

docker exec -it postgres psql -U postgres --password

Вы должны войти со своим паролем postgres, и откроется интерфейс postgres:

Теперь вы создадите свою базу данных для разработки.

Здесь есть наблюдение, вы можете создать базу данных с любым именем, но если вы это сделаете, вам необходимо настроить ее в database.yml.

Чтобы создать свою базу данных:

CREATE DATABASE project_name_development;

Команда «\ q» используется, когда вы хотите выйти из интерфейса postgres.

Я использовал имя, которое было на моей странице ошибки, чтобы упростить.

Теперь, если вы запустите проект, вы увидите страницу приветствия Rails 6.

Вывод

Помните, что мы настраиваем все только для среды разработки. Чтобы сделать это в производственной среде, вам также придется создать производственные базы данных.

Я надеюсь, что эта история помогла вам, и я открыт для прояснения возможных сомнений.

использованная литература

Изображение взято с PixaBay