Postgres Сценарий инициализации не работает Docker версия 3.4 - PullRequest
2 голосов
/ 28 марта 2020

Пытаясь докернизировать приложение и в моем приложении, у меня есть следующее

docker -compose.yml

version: '3.4'

services:
  app: 
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - database
    ports: 
      - "3000:3000"
    volumes:
      - .:/app
      - gem_cache:/usr/local/bundle/gems
    env_file: .env
    environment:
      RAILS_ENV: development

  database:
    image: postgres:10.12
    volumes:
      - ./init.sql/:/docker-entrypoint-initdb.d/init.sql
      - db_data:/var/lib/postgresql/data

volumes:
  gem_cache:
  db_data:

В моем init. sql file

CREATE USER user1 WITH PASSWORD 'password';
ALTER USER user1 WITH SUPERUSER;

я уже запустил chmod +x init.sql

В моем файле .env у меня есть следующее

DATABASE_NAME=tools_development
DATABASE_USER=user1
DATABASE_PASSWORD=password
DATABASE_HOST=database

И это мой Dockerfile

FROM ruby:2.7.0

ENV BUNDLER_VERSION=2.1.4

RUN apt-get -y update --fix-missing


RUN apt-get install -y bash git build-essential nodejs libxml2-dev openssh-server libssl-dev libreadline-dev zlib1g-dev postgresql-client libcurl4-openssl-dev libxml2-dev libpq-dev tzdata

RUN gem install bundler -v 2.1.4

WORKDIR /app

COPY Gemfile Gemfile.lock ./

RUN bundle check || bundle install 

COPY . ./ 

ENTRYPOINT ["./entrypoint.sh"]

Но каждый раз, когда я запускаю docker-compose run --build и пытаюсь запустить мое приложение. Я получаю сообщение об ошибке:

could not translate host name "database" to address: Name or service not known

Я перепробовал все возможное, но ошибка все та же.

Кто-нибудь знает, как решить эту проблему?

Я знаю, что проблема возникает из-за того, что сценарии инициализации postgres не запущены. Я видел много вариантов в Интернете, и я попробовал все, но я все еще сталкиваюсь с той же ошибкой.

Любая помощь приветствуется

Спасибо

1 Ответ

0 голосов
/ 28 марта 2020

Из документации postgres docker видно, что POSTGRES_USER и POSTGRES_PASSWORD являются необходимыми переменными среды для настройки postgres контейнера

You может добавить эти переменные среды в ваш файл .env. Таким образом, файл будет выглядеть следующим образом:

.env

DATABASE_NAME=tools_development
DATABASE_USER=user1
DATABASE_PASSWORD=password
DATABASE_HOST=database

POSTGRES_USER=user1
POSTGRES_PASSWORD=password
POSTGRES_DB=tools_development

Эти переменные среды будут использоваться из контейнера postgres для инициализации БД и назначения пользователя, чтобы вы могли получить избавиться от файла init.sql

После этого вам нужно добавить ссылку на файл .env в службу базы данных (postgres: 10.12).
Таким образом, ваш docker compose файл должен быть следующим:

docker -compose.yml

...
  database:
    image: postgres:10.12
    volumes:
      - db_data:/var/lib/postgresql/data
    env_file: .env 
...
...