Почему мой Docker PostgreSQL контейнер больше не работает? - PullRequest
3 голосов
/ 24 февраля 2020

С тех пор, как я обновил Docker Рабочий стол для Windows с 2.1.0.5 до версии 2.2.0.3, у меня возникла проблема с контейнером db для моего приложения. Раньше все это работало нормально на 2.1.0.5, но теперь оно не будет работать даже после того, как я удалил 2.2.0.3 и вернулся к 2.1.0.5. Действительно, wi sh Я не обновил сейчас.

Я получаю ошибку:

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

Когда я запускаю docker ps, я вижу, что контейнер postgres даже не работает.

Некоторые вещи, которые я пробовал:

  1. Добавление базы данных в мой файл Windows 10 hosts.

  2. Предоставление порта 5432 для БД в docker -compose.yml

Ничего не работает.

Может кто-нибудь предложить какие-либо идеи, чтобы помочь мне понять и исправить проблема?

Мой Docker файл:

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /my-app
WORKDIR /my-app
RUN echo 'gem: --no-document' >> ~/.gemrc
COPY . /my-app
EXPOSE 3000

Мой docker -compose.yml:

version: '3'
services:
  db:
    image: postgres
    volumes:
      - postgres:/var/lib/postgresql/data/
  redis:
    image: 'redis:4-alpine'
    environment:
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    ports:
      - '6379:6379'
    command: redis-server --requirepass somepassword
    volumes:
      - redis:/data/
  myapp:
    build: ./myapp/
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      - RAILS_ENV=development
      - PORT=3000
      - REDIS_URL=redis://:somepassword@redis:6379/0
    ports:
      - '3000:3000'
    working_dir: /myapp/
    volumes:
      - ./myapp:/myapp:cached
      - myapp_gems:/usr/local/bundle/
      - /myapp/tmp/
    depends_on:
      - db
      - redis
  myapp_sidekiq:
    build: ./myapp/
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec sidekiq -C config/sidekiq.yml"
    environment:
      - RAILS_ENV=development
      - PORT=3000
      - REDIS_URL=redis://:somepassword@redis:6379/0
    working_dir: /myapp/
    volumes:
      - ./myapp:/myapp:cached
      - myapp_gems:/usr/local/bundle/
      - /myapp/tmp/
    depends_on:
      - db
      - redis

volumes:
  postgres:
    external: true
  redis:
    external: true
  myapp_gems:

Мой database.yml:

# Configure Using Gemfile
# gem 'pg'
#
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: 5
  host: db
  username: postgres
  password:

РЕДАКТИРОВАТЬ: В ответ на @Brits, вот вывод docker -compose up db:

Attaching to dev_db_1
db_1                | Error: Database is uninitialized and superuser password is not specified.      
db_1                |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1                |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1                | 
db_1                |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1                |        connections without a password. This is *not* recommended.     
db_1                | 
db_1                |        See PostgreSQL documentation about "trust":
db_1                |        https://www.postgresql.org/docs/current/auth-trust.html        
dev_db_1 exited with code 1

Это интересно, потому что я не указывал POSTGRES_PASSWORD ранее, и это работал нормально.

Благодаря @Brits я смог отследить проблему. Это было вызвано недавним изменением, незаметным для радара, на docker -library / postgres, для которого требуется, чтобы по умолчанию указывалось значение POSTGRES_PASSWORD, как указано в этой проблеме Github

1 Ответ

4 голосов
/ 24 февраля 2020

Благодаря @Brits мне удалось отследить проблему.

Это было вызвано недавним изменением, незаметным для радара, на docker -library / postgres, для которого требуется POSTGRES_PASSWORD для будет определено по умолчанию в будущем, как указано в этой проблеме Github

Вот как это исправить:

Добавьте POSTGRES_PASSWORD в качестве переменной среды в docker - compose.yml (контейнер postgres, а также контейнер приложения):

version: '3'
services:
  db:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=somepassword
    volumes:
      - postgres:/var/lib/postgresql/data/
  redis:
    image: 'redis:4-alpine'
    environment:
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    ports:
      - '6379:6379'
    command: redis-server --requirepass somepassword
    volumes:
      - redis:/data/
  myapp:
    build: ./myapp/
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      - RAILS_ENV=development
      - PORT=3000
      - REDIS_URL=redis://:somepassword@redis:6379/0
      - POSTGRES_PASSWORD=somepassword
    ports:
      - '3000:3000'
    working_dir: /myapp/
    volumes:
      - ./myapp:/myapp:cached
      - myapp_gems:/usr/local/bundle/
      - /myapp/tmp/
    depends_on:
      - db
      - redis
  myapp_sidekiq:
    build: ./myapp/
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec sidekiq -C config/sidekiq.yml"
    environment:
      - RAILS_ENV=development
      - PORT=3000
      - REDIS_URL=redis://:somepassword@redis:6379/0
    working_dir: /myapp/
    volumes:
      - ./myapp:/myapp:cached
      - myapp_gems:/usr/local/bundle/
      - /myapp/tmp/
    depends_on:
      - db
      - redis

volumes:
  postgres:
    external: true
  redis:
    external: true
  myapp_gems:

Затем добавьте переменную ENV для POSTGRES_PASSWORD в базу данных приложения .yml:

# Configure Using Gemfile
# gem 'pg'
#
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: 5
  host: db
  username: postgres
  password: <%= ENV['POSTGRES_PASSWORD'] %>
...