Jika saya memiliki data.sql, bagaimana saya dapat mengimpor database ke container docker mysql saya? Bagaimana saya bisa mengimpor data database. Dalam dunia buruh pelabuhan, hal ini menambah lapisan kerumitan. tolong beberapa metode.
Di sini saya 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"
Jawaban:
Sepertinya saya tidak dapat membuat ini berfungsi dengan mysql atau mysql terbaru: 5.7. Jadi saya menggunakan mariaDB sebagai gantinya. Ini
docker-compose.yaml
kode saya .sumber
cd /docker-entrypoint-initdb.d/dump.sql/
& lalu saya berada di direktori? Apa yang menyebabkan direktori dibuat alih-alih tidak memiliki file .sql di sana sama sekali atau menimbulkan semacam kesalahan? buruh pelabuhan-compose.yml saya yang relevan untuk wadah mariadb:mariadb: image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #creates a directory? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
Anda dapat mengimpor database setelahnya:
docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
sumber
docker exec -i $(docker-compose ps -q mysql-container) mysql …
. Saat ini tidak mendukung membaca dari stdin, seperti yang dijelaskan di sini .-p
tanpa kata sandi untuk tujuan keamanan.-t
opsi untukdocker exec
? Juse digunakan-i
untuk menghindari kesalahanPasang sql-dump Anda di bawah
/docker-entrypoint-initdb.d/yourdump.sql
menggunakan pemasangan volumeIni akan memicu impor sql-dump selama dimulainya penampung, lihat https://hub.docker.com/_/mysql/ di bawah "Menginisialisasi instance baru"
sumber
Pilihan lain jika Anda tidak ingin memasang volume, tetapi ingin membuang file dari mesin lokal Anda, adalah menyalurkan
cat yourdump.sql
. Seperti:Lihat: https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb
sumber
dump.sql
berisisource
fileImpor menggunakan docker-compose
sumber
Saya dapat mengimpor dengan perintah ini
sumber
docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql
. Selain itu menurut saya ada kesalahan dalam pernyataan Anda. Harus ada spasi antara-u
dan nama pengguna itu sendiri.gabungkan https://stackoverflow.com/a/51837876/1078784 dan jawaban atas pertanyaan ini, menurut saya jawaban terbaiknya adalah:
cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"
misalnya di sistem saya perintah ini akan terlihat seperti:
cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
Anda juga dapat menggunakan pv untuk memantau kemajuan:
cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
Dan yang paling penting disini adalah "--init-command" yang akan mempercepat proses import 10 kali lebih cepat.
sumber
Anda dapat mengikuti langkah-langkah sederhana ini:
CARA PERTAMA:
pertama-tama salin file dump SQL dari direktori lokal Anda ke wadah mysql. gunakan perintah docker cp
dan kemudian jalankan mysql-container menggunakan (CATATAN: jika Anda menggunakan versi alpine Anda perlu mengganti bash dengan sh pada perintah di bawah ini.)
dan kemudian Anda cukup mengimpor file dump SQL ini.
CARA KEDUA: SEDERHANA
Seperti yang disebutkan di halaman resmi hub Docker mysql.
Setiap kali kontainer dimulai untuk pertama kalinya, database baru dibuat dengan nama yang ditentukan dalam variabel MYSQL_DATABASE - yang dapat Anda lewati dengan mengatur variabel lingkungan, lihat di sini cara mengatur variabel lingkungan
Secara default container akan mengeksekusi file dengan ekstensi .sh, .sql dan .sql.gz yang terdapat di folder /docker-entrypoint-initdb.d. File akan dieksekusi dalam urutan abjad. dengan cara ini file SQL Anda akan diimpor secara default ke database yang ditentukan oleh variabel MYSQL_DATABASE.
untuk lebih jelasnya Anda selalu dapat mengunjungi halaman resmi
sumber
Mencoba
"docker exec ... < data.sql"
di respons Window PowerShell dengan:Tapi seseorang bisa menyelesaikannya
cmd /c
untuk menghilangkan masalah:sumber
Anda dapat menjalankan penampung yang menyetel direktori bersama (-v volume), lalu menjalankan bash di penampung itu. Setelah ini, Anda dapat secara interaktif menggunakan mysql-client untuk mengeksekusi file .sql, dari dalam container. obs: / my-host-dir / shared-dir adalah lokasi .sql di sistem host.
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
Di dalam wadah ...
Parameter khusus:
sumber
Yang ini berhasil untuk saya
$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql
Pertama jika Anda ingin tahu apa itu NAME_CONTAINER_MYSQL, Anda harus menggunakan perintah di bawah ini:
$ docker ps
Di kolom keluaran NAME Anda akan melihat NAME_CONTAINER_MYSQL yang perlu Anda ganti pada perintah di atas.
sumber
lakukan
docker cp file.sql <CONTAINER NAME>:/file.sql
dulukemudian
docker exec -i <CONTAINER NAME> mysql -u user -p
lalu di dalam wadah mysql jalankan
source \file.sql
sumber
Anda dapat menyalin file ekspor misalnya dump.sql menggunakan docker cp ke dalam wadah dan kemudian mengimpor db. jika Anda membutuhkan instruksi lengkap, beri tahu saya dan saya akan memberikannya
sumber