我正在尝试使用Docker创建一组容器(wordpress和MySQL),这将有助于我使用Wordpress进行本地开发。当我们运行一个实时数据库时,我想将dump.sql文件挂载到Docker mysql容器中。下面是我的.yml文件。
version: '2'
services:
db:
image: mysql:latest
volumes:
- ./data:/docker-entrypoint-initdb.d #./data holders my dump.sql file
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
volumes:
- ./wp-content/themes/portalV3:/var/www/html/wp-content/themes/portalV3
- ./wp-content/plugins:/var/www/html/wp-content/plugins
- ./wp-content/uploads:/var/www/html/wp-content/uploads
一切正常,但是~10秒后,mysql的docker容器崩溃了。通过日志,我收到以下错误:
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/dump.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR: Can't initialize batch_readline - may be the input source is a directory or a block device.
仔细检查(附加到重新启动的mysql容器)我看到确实我的dump.sql文件没有传输到容器,但在/ docker-entrypoint-initdb中创建了一个具有相同名称的文件夹。 d。
任何人都可以帮我理解我是如何让docker-compose复制我的dump.sql文件并导入数据库的?
干杯,
彼得
答案 0 :(得分:1)
docker-entrypoint-initdb.d的问题在于,因为源“数据”是目录而不是文件,所以目标文件(docker-entrypoint-initdb.d)也必须是目录。反之亦然。
所以
volumes:
- ./data:/docker-entrypoint-initdb.d/
或..
volumes:
- ./data/mydump.sql:/docker-entrypoint-initdb.d/mydump.sql
答案 1 :(得分:0)
是的,这就是挂载.sql或.sh文件的方法,即通过将SQL或sh文件映射到docker容器的docker-entrypoint-initdb.d
文件夹来添加卷。但是,由于某些奇怪的原因而引发了错误,可能是因为MySQL docker版本过旧。
您可以通过创建自定义图片来解决此问题,
Dockerfile
FROM mysql:5.7
COPY init.sql /docker-entrypoint-initdb.d/
它会创建一个图像,并在启动容器时帮助运行初始化脚本。
要在撰写文件中使用此文件,请将您的SQL文件和Dockerfile放在一个文件夹中。
database
|---init.sql
|---Dockerfile
docker-compse.yml
version: '3'
services:
mysqldb:
image: mysqldb
build: ./database
container_name: mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=test
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=test
这样,您可以轻松配置环境变量。