data.sql MySQLDockerコンテナをインポートします


87

data.sqlがある場合、データベースをmysql dockerコンテナにインポートするにはどうすればよいですか?データベースデータをインポートする方法。ドッキングされた世界では、これにより複雑さが増します。いくつかの方法をお願いします。

ここに私のdocker-compose.yml:

nginx:
  build: ./nginx/
  container_name: nginx-container
  ports:
    - 80:80
  links:
    - php
  volumes_from:
    - app-data

php:
  build: ./php/
  container_name: php-container
  expose:
    - 9000
  links:
    - mysql
  volumes_from:
    - app-data

app-data:
  image: php:7.0-fpm
  container_name: app-data-container
  volumes:
    - ./www/html/:/var/www/html/
  command: "true"

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes_from:
    - mysql-data
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

mysql-data:
  image: mysql:latest
  container_name: mysql-data-container
  volumes:
    - /var/lib/mysql
  command: "true"

SQLファイルをコンテナにコピーしてから、データをファイルにロードします。
ジェイブランチャード2017年

回答:


58

最新のmysqlまたはmysql:5.7でこれを機能させることができないようです。そのため、代わりにmariaDBを使用します。これが私のdocker-compose.yamlコードです。

version: '3'

services:
  mysql:
    image: mariadb:10.3
    container_name: mariadb
    volumes:
      - container-volume:/var/lib/mysql
      - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: name_db
    ports:
      - "3306:3306"

volumes:
  container-volume:

この方法を使おうとすると、dump.sqlのディレクトリになってしまいますか?理由について何か考えはありますか?例:mariadbコンテナにbash&:cd /docker-entrypoint-initdb.d/dump.sql/&それから私はディレクトリにいますか?.sqlファイルがまったくないか、何らかのエラーがスローされる代わりに、ディレクトリが作成される原因は何ですか?mariadbコンテナーに関連するdocker-compose.yml:mariadb: image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #creates a directory? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
K8sN0v1c 39

150

後でデータベースをインポートできます。

docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql


23
docker-composeを使用する場合は、次の方法でコンテナーを取得する必要がありますdocker exec -i $(docker-compose ps -q mysql-container) mysql …ここで説明するように、現時点ではstdinからの読み取りはサポートされていません。
slhck 2017

2
docker-composeでこれを行う方法は?
iamjc0 1518

7
わたし。「入力デバイスがTTYではありません」エラーを取得
カマル

参考:-pセキュリティ上の理由から、パスワードなしで使用してください。
AbdullaNilam19年

2
@kamalの-tオプションを使用しましたdocker execか?日科技連の使用-iエラーを回避するために
ヴォルフガング

83

/docker-entrypoint-initdb.d/yourdump.sqlボリュームマウントを利用してSQLダンプをマウントします

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes:
    - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

これにより、コンテナの開始時にsql-dumpのインポートがトリガーされます。https://hub.docker.com/_/mysql/の「Initializingafreshinstance」を参照して ください


3
+ 1 @ EugenMayer。間違いなく、Compose v1を使用している人は、最新のv3構文に移行する必要があります:docs.docker.com/compose/compose-file
Mano Marks

1
たとえそれが不便であっても、V3はV2の後継ではありません。V3は基本的に群れのみであり、後継ではなくフォークです。これに関するDockersのコメントを参照してください。大きな問題の1つは、volumr_fromマウントの可能性がないことです
Eugen Mayer

20
データベースサービス用の永続ボリュームを作成した場合、再作成しない限り、新しい.sqlファイルをチェックしないことを覚えておいてください。これに数時間を失った、私は他の誰も同じことを経験しないことを望みます。
ダザガ語2018

1
@DhwanilPatelは、-build--force-recreateオプションを使用する必要があります。 docs.docker.com/compose/reference/up例えばアップドッキングウィンドウ-構成--build --force-再作成
Dazag

@Dazag実際、私はすでに次のコマンドを使用しています: "sudo docker-compose up -d --force-recreate --build"しかし、何も起こりません
DhwanilPatel19年

22

ボリュームをマウントしたくないが、ローカルマシンからファイルをダンプしたい場合の別のオプションは、パイプすることcat yourdump.sqlです。そのようです:

cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name

参照:https//gist.github.com/spalladino/6d981f7b33f6e0afe6bb


ファイルdump.sqlが含まれている場合は完全にsource機能します
Chu

11

docker-composeを使用してインポートします

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>

エラーが発生します-mysql:[警告]コマンドラインインターフェイスでパスワードを使用すると安全でない可能性があります。1行目のエラー1064(42000):SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、「mysqldump:[警告]コマンドラインインターフェイスでパスワードを使用すると、1行目でinsecになる可能性があります」の近くで使用する正しい構文を確認してください。unix@-> / var / run / dockerを読み取ります。 sock:読み取り:ピアによって接続がリセットされました
R Sun

plsは、この警告がdump.sqlにまだ表示されていないことを確認します。mysqldumpを使用してファイルを作成し、コマンドラインでパスワードを指定すると、警告はダンプされたファイルになります。
ステファンフランク

5

https://stackoverflow.com/a/51837876/1078784 とこの質問の回答を組み合わせると、最良の回答は次のようになります。

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"

たとえば、私のシステムでは、このコマンドは次のようになります。

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

また、pvを使用して進行状況を監視することもできます。

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

そして、ここで最も重要なことは、インポートの進行を10倍速くする「--init-command」です。


stdinはttyではありません...これに本当に飽きてきました、これに対する解決策は何ですか?
BramB19年

あなたの意味がわからない、多分あなたは私にもっと詳細を教えてもらえますか?
Matt.Cai

4

このコマンドでインポートできます

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql

何が何であるかを判断するのは難しいですが、私は同じようにやっていdocker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sqlます。それに加えて、あなたの発言には誤りがあると思います。-uとユーザー名自体の間にはスペースが必要です。
ゴードンフリーマン

3

次の簡単な手順に従うことができます。

最初の方法:

まず、SQLダンプファイルをローカルディレクトリからmysqlコンテナにコピーします。dockercpコマンドを使用する

docker cp [SRC-Local path to sql file] [container-name or container-id]:[DEST-path to copy to]

docker cp ./data.sql mysql-container:/home

次に、を使用してmysql-containerを実行します(注:アルパインバージョンを使用している場合は、以下のコマンドでbashをshに置き換える必要があります)。

docker exec -it -u root mysql-container bash

次に、このSQLダンプファイルをインポートするだけです。

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

2番目の方法:シンプル

docker cp ./data.sql mysql-container:/docker-entrypoint-initdb.d/

mysqlDockerハブの公式ページで述べたように。

コンテナが初めて起動するたびに、MYSQL_DATABASE変数に指定された名前で新しいデータベースが作成されます。これは環境変数設定することで渡すことができます。環境変数の設定方法についてはこちらをご覧ください。

デフォルトでは、コンテナーは、/ docker-entrypoint-initdb.dフォルダーにある拡張子.sh、.sql、および.sql.gzのファイルを実行します。ファイルはアルファベット順に実行されます。このようにして、SQLファイルはデフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます。

詳細については、いつでも公式ページをご覧ください。


1

共有ディレクトリ(-v volume)を設定してコンテナを実行し、そのコンテナでbashを実行できます。この後、mysql-clientをインタラクティブに使用して、コンテナー内から.sqlファイルを実行できます。obs:/ my-host-dir / shared-dirは、ホストシステム内の.sqlの場所です。

docker run --detach --name=test-mysql -p host-port:container-port  --env="MYSQL_ROOT_PASSWORD=my-root-pswd" -v /my-host-dir/shared-dir:/container-dir mysql:latest


docker exec -it test-mysql bash

コンテナ内...

mysql -p < /container-dir/file.sql 

カスタムパラメータ:

  • test-mysql(コンテナ名)
  • ホストポートコンテナポート
  • my-root-pswd(mysqlルートパスワード)
  • / my-host-dir / shared-dirおよび/ container-dirコンテナーにマウントされるホスト・ディレクトリー、および共有ディレクトリーのコンテナーの場所)

0

これは私のために働く

$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql

まず、NAME_CONTAINER_MYSQLとは何かを知りたい場合は、以下のコマンドを使用する必要があります。

$ docker ps

出力列NAMEに、上記のコマンドで置き換える必要のあるNAME_CONTAINER_MYSQLが表示されます。


0

次のコマンド"docker exec ... < data.sql"でWindowPowerShellの応答を試してみます。

'<'演算子は、将来の使用のために予約されています。

しかしcmd /c、問題を解決するためにそれをまとめることができます:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"

-2

docker cpを使用してdump.sqlなどのエクスポートファイルをコンテナにコピーしてから、dbをインポートできます。あなたが完全な指示を必要とするならば、私に知らせてください、そして、私は提供します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.