Я создаю два контейнера докеров для приложения и базы данных. При первом запуске docker-compose up
приложение работает. Однако в следующих попытках появляется:
Database 'time_distribution_production' already exists.
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
Докерфайл
FROM ruby:3.1.2
ENV BUNDLER_VERSION=2.3.24
RUN apt update -qq && apt install -y libmsgpack-dev postgresql-client
RUN gem install bundler -v 2.3.24
RUN mkdir /time-distribution
WORKDIR /time-distribution
ENV RAILS_ENV production
COPY Gemfile .
COPY Gemfile.lock .
RUN bundle install
COPY . .
EXPOSE 3000
RUN chmod +x docker.sh
CMD ./docker.sh
докер.ш
#!/bin/bash
set -e
rm -f tmp/pids/server.pid
bundle exec rails db:setup
bundle exec rails db:migrate
bundle exec rails assets:precompile
bundle exec rails server -p 3000 -b '0.0.0.0'
докер-compose.production.yml
version: '3'
services:
app:
image: $IMAGE_NAME
restart: always
database:
restart: always
database.yml для рабочей базы данных
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
production:
<<: *default
database: <%= Rails.application.credentials.dig(:production, :postgres_name) %>
username: <%= Rails.application.credentials.dig(:production, :postgres_username) %>
password: <%= Rails.application.credentials.dig(:production, :postgres_password) %>
host: database
Я заметил, что ошибка исчезает при сбросе громкости: docker compose down -volumes
. Я попытался перезапустить контейнеры на сервере. Это не помогло. Подскажите пожалуйста как решить проблему. Заранее большое спасибо!
Эта команда в вашем docker.sh
bundle exec rails db:setup
удалит все данные в базе данных. Это, конечно, не то, что вы хотите делать в своей производственной среде.
Вместо этого я предлагаю просто попытаться создать базу данных с помощью
bundle exec rails db:create
Что не удается, когда база данных уже существует, но это можно игнорировать. На следующем шаге миграция будет работать независимо от того, является ли база данных совершенно новой или существовала ранее:
bundle exec rails db:create
bundle exec rails db:migrate
bundle exec rails assets:precompile