web-dev-qa-db-ja.com

Docker Compose mysql import .sql

Docker-composeで.sqlダンプファイルをインポートするのに問題があります。私はドキュメントに従いましたが、どうやらdocker-entrypoint-initdb.dから.sqlファイルをロードするようです。ただし、docker-compose upを実行すると、sqlファイルはコンテナーにコピーされません。

-vfフラグを使用してコンテナを停止しようとしましたが、それも機能しませんでした。 .ymlスクリプトで何か間違ったことをしていますか?

構成ファイルがあるルートのdatabase/db-dump /ディレクトリにdump.sqlがあります。

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
17
GafferG

ボリューム設定で何度も試行した後、回避策が見つかりました

Dockerfileに以下を含むmysqlに基づく別のイメージを作成しました

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

この方法で、ダンプは常にコピーされ、起動時に実行されます

24
GafferG

これは私のために働いた、

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がインポートされます。

12
Sridhar Sg

これは、Docker MySQLイメージのドキュメントページに表示されます。 https://hub.docker.com/_/mysql/

新しいインスタンスの初期化

コンテナが初めて起動されると、指定された名前の新しいデータベースが作成され、指定された構成変数で初期化されます。さらに、/ docker-entrypoint-initdb.dにある拡張子.sh.sqlおよび.sql.gzを持つファイルを実行します。ファイルはアルファベット順に実行されます。 SQLダンプをそのディレクトリにマウントする でmysqlサービスを簡単に設定し、提供されたデータで カスタムイメージ を提供できます。 SQLファイルは、デフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます。

11
Mvochoa

Mysqlデータベースダンプschema.sql/ mysql-dump/schema.sqlディレクトリにあり、初期化プロセス中にテーブルを作成します。

docker-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}
9
ufukomer

私はmysqlで同様の問題を抱えていました。そこでは、docker-composeを介してmydatabasedump.sqlファイルを含むローカルディレクトリを/ configs/mysql/dataにマウントし、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:

この問題に対する2つの有効なソリューションを見つけました。

1つ目は、実行中のコンテナにログインして、mydatabasedump.sqファイルがコンテナのdocker-entrypoint-initdb.dディレクトリに存在し、実行可能であることを確認した後のものです。コンテナの初期化後に実行されたdump.shというローカルの/ configs/mysql/dataディレクトリにbashスクリプトを作成して追加しました。 my_database_dump.sqlをmy_app_databaseにコピーする単一のmysqlコマンドが含まれています。 bashスクリプトは次のようになります

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

このスクリプトは、次のようにENTRYPOINTディレクティブでDockerfileを介して実行しました。

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

最初の問題を認識した後、コテイナーが構築された後にボリュームが削除されたため、起動時にデータベースにダンプファイルを組み込み(またはそのディレクトリ内のスクリプトを実行しなかった)、2番目の解決策は単にボリュームディレクティブを移動することでした作成したディレクティブの上の私の作成ファイルで。これにより、Dockerfileのdump.shスクリプトとDOCKERENTRYディレクティブを削除できました。変更された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
0
Andre Myrtil