我敢肯定这是一个重复的话题,但是我根本无法完成:我喜欢在运行时间内将数据库转储恢复到MySQL容器,而无需修改 docker-compose.yml file。
dockerfile
FROM php:5.4.45-apache
RUN apt-get update
RUN docker-php-ext-install mysql mysqli
docker-compose.yml
version: '2'
services:
php_service:
container_name: my_php
# Use Dockerfile in this dir to build the image
build: .
# Stop containers always after exiting.
restart: always
ports:
# 'localhost' does not works from the host, but the IP of docker itself
# (192.168.99.100 for example - shown on the top of the console)
- "80:80"
- "443:443"
environment:
# Pass variables
- API_TOKEN=xxxx
volumes:
# The current directory will be mounted to '/var/www/html'
# WORKS ONLY IN USER'S DIR ON WINDOWS (~/Downloads for example)
- .:/var/www/html
# See https://hub.docker.com/_/mysql/ for additional information.
# To open up console, run `docker exec -it my_mysql bash`.
# To restore a dump `docker exec -i my_mysql /usr/bin/mysql -u root
# --password=test_pass DATABASE < DUMP.sql` should work, but it never did.
mysql_service:
container_name: my_mysql
# Use an existing image
image: mysql:5.6
restart: always
ports:
# Let it accessible for other apps (mysql on host, IDE, etc.)
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
MYSQL_USER: 'test'
MYSQL_PASS: 'pass'
volumes:
# Named volumes (my-datavolume) has to be listed in the "volumes"
# section - I don't know how it works or what is it doing at all...
# (-_-')
- my-datavolume:/var/lib/mysql
volumes:
my-datavolume:
复制的步骤:
- 在Windows 7主机上启动Docker工具箱
-
docker-compose up
- 打开一个新的Docker工具箱终端
-
docker exec my_msql /usr/bin/mysql -u root --password=test_pass -e 'CREATE DATABASE testdb;'
-
docker exec -i my_mysql /usr/bin/mysql -u root --password=test_pass testdb < dump_on_host.sql
-
docker exec -it my_mysql /usr/bin/mysql -u root --password=test_pass testdb
-
mysql> SHOW TABLES;
数据库为空。看来它无能为力,因为终端响应太快。我通过在主机上安装MySQL尝试了转储,可以恢复。
尝试以下命令对我有效。
从Docker Host Machine运行。
备份
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
还原
cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE
如果有任何问题,请让我知道。
dockerhub上的文档为我工作:https://hub.docker.com/_/mysql
备份
docker exec some-mysql sh -c 'exec mysqldump --all-databases -u<user> -p<password> <database>' > /some/path/on/your/host/all-databases.sql
还原
docker exec -i some-mysql sh -c 'exec mysql -u<user> -p<password> <database>' < /some/path/on/your/host/all-databases.sql
您正在使用卷,这意味着在恢复转储后,数据将持续。
您还将公开端口3306中的数据库,因此解决方案可能是通过客户端连接到数据库。您可以使用MySQL Workbench等图形客户端连接到MySQL,并从那里还原数据库。
,或者如果您已在命令行中安装了mySQL
$ mysql --host=127.0.0.1 --port=3306 -u test -p testdb < dump_on_host.sql
根据https://hub.docker.com/_/mysql的最新说明,您可以做到这一点:
docker-compose exec -T mysql_service sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" testdb' < dump_on_host.sql
这有一个很好的好处,即不将密码输入您的命令历史记录。
一个docker db到另一个docker db
备份
docker exec containerid mysqldump -u root --password=root portal-db > lower-portal-db.sql
还原
cat lower-portal-db.sql | docker exec -i containerid mysql -u root --password=root portal-db
尝试以下命令
sudo docker exec -i CONTAINER_ID sh -c 'exec mysql -u root -p[YourPassword] database_name' < /your/database/directory/database_name.sql;