Ошибка: база данных не инициализирована и пароль не указан - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в докере. Я следовал этому уроку: https://medium.com/coderscorner/connecting-to-mysql-through-docker-997aa2c090cc. Я установил пароль root, но как только я попытался получить доступ к команде mysql, он выдает эту базу данных как неинициализированную ошибку. Кроме того, когда я выполняю команду docker-compose up для извлечения необходимых модулей, она выдает django.db.utils.InternalError: (1049, "Неизвестная база данных 'bitpal'") . Команда, которую я поместил, была:

docker run --name=mysql -e MYSQL_USER=root MYSQL_ROOT_PASSWORD=password -d mysql

Я считаю, что я искал ответы здесь, но я не мог быть уверен, что случилось.

докер-compose.yml

version: '2'
services:
  # Redis
  mysql:
    image: mysql:5.7
    restart: always
    hostname: mysql
    container_name: mysql
    environment:
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DB=bitpal
    ports:
      - "3306:3306"


  # Redis
  redis:
    image: redis:latest
    restart: always
    hostname: redis
    container_name: redis
    ports:
      - "6379:6379"


  # Django web server
  bitpal:
    image: python:3.5
    restart: always
    hostname: bitpal
    container_name: bitpal
    working_dir: /bitpal
    command: ./bin/start_dev.sh
    volumes:
      - ./bitpal:/bitpal
      - ./etc/config:/etc/config
      - ./log:/log
    ports:
      - "80:80"
    links:
      - mysql
      - redis
    depends_on:
      - mysql
    environment:
      # Database
      - DB_NAME=bitpal
      - DB_USER=root
      - DB_PASSWORD=password
      - DB_HOST=mysql
      - DB_PORT=3306


  # Celery worker
  worker:
    image: python:3.5
    restart: always
    container_name: worker
    command: bash -c "./bin/install.sh && ./bin/celery_worker.sh"
    working_dir: /bitpal
    volumes:
      - ./bitpal:/bitpal
      - ./etc/config:/etc/config
      - ./log:/log
    links:
      - mysql
      - redis
    depends_on:
      - redis


  # Bitshares websocket listener
  websocket_listener:
    image: python:3.5
    restart: always
    container_name: websocket_listener
    command: bash -c "./bin/install.sh && ./bin/websocket_listener.sh"
    working_dir: /bitpal
    volumes:
      - ./bitpal:/bitpal
      - ./etc/config:/etc/config
      - ./log:/log
    links:
      - mysql
      - redis
    depends_on:
      - redis


  # Nginx
  nginx:
    image: nginx:1.12.1
    container_name: nginx
    ports:
      - "8000:80"
    volumes:
      - ./bitpal:/home/bitpal/bitpal/bitpal
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - bitpal

Мой каталог выглядит следующим образом.

`**ROOT**
     `root: .gitignore, docker-compose.yml, docker-compose-production.yml... 
     /bitpal /etc /log /nginx /public_html`

**ROOT/bitpal**
      `.gitignore, Dockerfile, Makefile, manage.py... /bin /bitpal /media 
      /static /tests`

Все файлы проекта .sh хранятся в корневом каталоге / bitpal / bin. Поместить вместо этого wait-for-it.sh или поместить в папки bitpal и nginx?

1 Ответ

0 голосов
/ 09 мая 2018

Этот урок, который вы читали, неполон. Он не говорил вам, что вы должны дождаться инициализации БД, если хотите ее использовать.

Сразу после запуска контейнера базы данных с помощью команды run вы должны проверить журналы этого контейнера и дождаться инициализации БД процесс завершен

Вы можете сделать это с:

$ docker logs -f <container name>

Где container name в вашем случае - mysql. Когда вы увидите, что db инициализирован и DB запущен, просто отсоедините (ctrl + c) от журналов и продолжайте.

Ваша БД готова к использованию.

важное примечание с учетом вашего составного файла

Этот составной файл не будет работать, потому что другие службы, такие как bitpal / worker, не ожидают инициализации службы БД.

Изначально загрузите скрипт wait-for-it.sh, который позволит другим сервисам ждать вашей базы данных при использовании файла compose для настройки вашего приложения. Сценарий, созданный vishnubob, доступен здесь здесь , затем скопируйте его во все каталоги, где находятся ваши службы, требующие базы данных.

В этих же каталогах создайте docker-entrypoint.sh файлы и напишите их так:

#!/bin/bash
set -e
sh -c './wait-for-it.sh mysql:3306 -t 30'
exec "$@"

Затем в ваш файл compose добавьте записи в каждый сервис, которому требуется БД (и где вы размещаете wait-for-it.sh скрипт), который будет выполнять скрипт ожидания:

entrypoint: ["./docker-entrypoint.sh"]

Затем ваши службы будут ждать, пока БД не будет инициализирована и готова к приему соединений.

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

Это один из единственно эффективных методов, поскольку depends_on не ожидает инициализации службы db, как это четко указано в официальных документах.

редактирование с объяснением расположения файлов root - bitpal + *some service files* + wait-for-it.sh + docker-entrypoint.sh - some_service_requiring_db + *some service files* + wait-for-it.sh + docker-entrypoint.sh - docker-compose.yml И ваш составной файл должен выглядеть так:

version: '2'
services:
  # MySQL service definition
  mysql:
    # like you have

  # some services

  # Django web server
  bitpal:
    # ...
    entrypoint: ["./docker-entrypoint.sh"]
    # further declarations
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...