Docker Compose mysql import.sql

У меня возникли проблемы с импортом файла.sql dump с docker-compose. Я следил за документами, которые, очевидно, будут загружать файл.sql из docker-entrypoint-initdb.d. Однако, когда я запускаю docker-compose up докеров, файл sql не копируется в контейнер.

Я попытался остановить контейнеры с флагом -vf, но это тоже не сработало. Я что-то делаю неправильно в моем сценарии.yml?

У меня есть dump.sql в базе данных каталога /db-dump/в корне, где находится мой файл compose.

frontend:
  image: myimage
  ports:
   - "80:80"
  links:
   - mysql
mysql:
  image: mysql
  ports:
   - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: rootpass
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: userpass
    MYSQL_DATABASE: myimage_db
  volumes:
   - ./database/db-dump:/docker-entrypoint-initdb.d

Ответы

Ответ 1

После многих попыток с настройками томов я нашел обходное решение

Я создал другое изображение на основе mysql со следующим в файле Dockerfile

FROM mysql:5.6

ADD dump.sql /docker-entrypoint-initdb.d

Затем удалили тома из композиции и запустили новое изображение

frontend:
  image: myimage
  ports:
   - "80:80"
  links:
   - mysql
mysql:
  image: mymysql
  ports:
   - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: rootpass
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: userpass
    MYSQL_DATABASE: myimage_db

Таким образом, дамп всегда копируется и запускается при запуске

Ответ 2

Это сработало для меня,

version: '3.1'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./mysql-dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: ecommerce

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

mysql-dump должен быть каталогом. Все .sql в каталоге будут импортированы.

Ответ 3

Это появляется на странице документации образа Docker MySQL: https://hub.docker.com/_/mysql/

Инициализация свежего экземпляра

Когда контейнер запускается в первый раз, будет создана новая база данных с указанным именем и инициализирована с предоставленными переменными конфигурации. Кроме того, он будет выполнять файлы с расширениями .sh, .sql и .sql.gz которые находятся в /docker-entrypoint-initdb.d. Файлы будут выполнены в алфавитном порядке. Вы можете легко заполнить ваши службы mysql, смонтировав дамп SQL в этот каталог и предоставив пользовательские изображения с предоставленными данными. Файлы SQL будут импортированы по умолчанию в базу данных, указанную в переменной MYSQL_DATABASE.

Ответ 4

Mysql базы данных dump schema.sql находится в каталоге /mysql-dump/schema.sql и создает таблицы в процессе инициализации.

докер-compose.yml:

mysql:
    image: mysql:5.7
    command: mysqld --user=root
    volumes:
      - ./mysql-dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

Ответ 5

У меня была похожая проблема с mysql, где я монтировал локальный каталог в /configs/mysql/data, содержащий файл mydatabasedump.sql, через docker-compose для тома docker-entrypoint-initdb.d, файл будет загружен в контейнер, но не будет выполняться или заполнять базу данных при инициализации контейнера. Мой первоначальный docker-compose.yml выглядит следующим образом:

#docker-compose.yml
version: '3'
services:
    db:
        build: ./build/mysql/ #this is pointing to my Dockerfile
        container_name: MYSQL_Database
        restart: always
        environment:
        MYSQL_PORT: 3306
        MYSQL_ROOT_PASSWORD: admin
        MYSQL_DATABASE: my_app_database
        MYSQL_USER: admin
        MYSQL_PASSWORD: admin
    volumes:
        - ./configs/mysql/data:/docker-entrypoint-initdb.d:

Я нашел два рабочих решения этой проблемы:

Первый пришел после того, как я вошел в работающий контейнер и подтвердил, что файл mydatabasedump.sq присутствовал и выполнялся в каталоге контейнера docker-entrypoint-initdb.d; Я создал и добавил bash-скрипт в мой локальный каталог /config/mysql/data с именем dump.sh, который выполнялся после инициализации контейнера. Он содержит одну команду mysql, которая копирует my_database_dump.sql в my_app_database. Сценарий bash выглядит следующим образом

    #!/bin/bash
    #dump.sh
    mysql -uadmin -padmin my_app_database < my_database_dump.sql 
    #end of dump.sh

Я выполнил этот сценарий через свой Dockerfile в директиве ENTRYPOINT, например:

    #Dockerfile
    FROM mysql:5.5
    ENTRYPOINT [ "dump.sh" ]
    EXPOSE 80
    #end of Dockerfile

После того, как начальная проблема возникла из-за того, что тома монтировались после сборки cotainer, и, следовательно, из-за того, что во время загрузки не использовалась база данных с файлом дампа (или не выполнялись какие-либо сценарии в этом каталоге), вторым решением было просто переместите директиву volume в моем compose файле выше встроенной директивы. Это сработало и позволило мне удалить скрипт dump.sh и директиву DOCKERENTRY в моем Dockerfile. Модифицированный docker-compose.yml выглядит следующим образом

#docker-compose.yml
version: '3'
services:
    db:
        volumes:
          - ./configs/mysql/data:/docker-entrypoint-initdb.d
       build: ./build/mysql/ #this is pointing to my Dockerfile
         container_name: MYSQL_Database
         restart: always
     environment:
         MYSQL_PORT: 3306
         MYSQL_ROOT_PASSWORD: admin
         MYSQL_DATABASE: my_app_database
         MYSQL_USER: admin
         MYSQL_PASSWORD: admin