Docker 编写 mysql 导入 .sql
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
在多次尝试音量设置后,我找到了解决方法
我基于 mysql 创建了另一个镜像,在 Dockerfile
中包含以下内容
FROM mysql:5.6
ADD dump.sql /docker-entrypoint-initdb.d
然后从 compose 中删除卷和 运行 新图像
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
这样转储总是被复制过来并且 运行 在启动时
这出现在 Docker MySQL 图片的文档页面上:https://hub.docker.com/_/mysql/
Initializing a fresh instance
When a container is started for the first time, a new database with
the specified name will be created and initialized with the provided
configuration variables. Furthermore, it will execute files with
extensions .sh
, .sql
and .sql.gz
that are found in
/docker-entrypoint-initdb.d. Files will be executed in alphabetical
order. You can easily populate your mysql services by mounting a SQL
dump into that
directory
and provide custom
images with contributed
data. SQL files will be imported by default to the database specified
by the MYSQL_DATABASE
variable.
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}
这对我有用,
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。
我遇到了与 mysql 类似的问题,我会在 /configs/mysql/data 挂载一个包含 mydatabasedump.sql 文件的本地目录,通过 docker-compose 到 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:
我找到了解决此问题的两个有效解决方案:
第一个是在我登录 运行 容器并确认 mydatabasedump.sq 文件存在并且在容器的 docker-entrypoint-initdb.d 目录中可执行之后;我创建并添加了
一个 bash 脚本到我的本地 /configs/mysql/data 目录,名为 dump.sh,在容器初始化后执行。它包含一个 mysql 命令,可将 my_database_dump.sql 复制到 my_app_database。
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 Dockerfile
在意识到最初的问题是由于构建 cotainer 后卷被 mouted 并且因此在启动时没有使用转储文件(或执行该目录中的任何脚本)来整合数据库之后,第二个解决方案很简单到
将我的 compose-file 中的 volumes 指令移到内置指令上方。这有效并允许我删除 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
我也有这个问题。我在 ./mysql-dump 上安装了一个本地目录,其中包含一个 init.sql 文件,通过 docker-compose 到 docker-entrypoint-initdb.d 卷,该文件会加载到容器中,但不会在容器初始化时执行或填充数据库。
我最初的 docker-compose.yml 看起来像这样:
mysqld:
image: mysql
container_name: mysqld
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/my.cnf
- ./init:/docker-entrypoint-initdb.d
env_file: .env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=fendou
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
但这对我不起作用。
我为这个问题找到了另一个可行的解决方案:
添加 --init-file /data/application/init.sql
到 mysql command.change 以上配置 like
mysqld:
image: mysql
container_name: mysqld
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/my.cnf
# - ./init:/docker-entrypoint-initdb.d
env_file: .env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=fendou
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--init-file /docker-entrypoint-initdb.d/init.sql #attention here
希望对你有所帮助
我在使用 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
在多次尝试音量设置后,我找到了解决方法
我基于 mysql 创建了另一个镜像,在 Dockerfile
中包含以下内容FROM mysql:5.6
ADD dump.sql /docker-entrypoint-initdb.d
然后从 compose 中删除卷和 运行 新图像
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
这样转储总是被复制过来并且 运行 在启动时
这出现在 Docker MySQL 图片的文档页面上:https://hub.docker.com/_/mysql/
Initializing a fresh instance
When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions
.sh
,.sql
and.sql.gz
that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by theMYSQL_DATABASE
variable.
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}
这对我有用,
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。
我遇到了与 mysql 类似的问题,我会在 /configs/mysql/data 挂载一个包含 mydatabasedump.sql 文件的本地目录,通过 docker-compose 到 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:
我找到了解决此问题的两个有效解决方案:
第一个是在我登录 运行 容器并确认 mydatabasedump.sq 文件存在并且在容器的 docker-entrypoint-initdb.d 目录中可执行之后;我创建并添加了 一个 bash 脚本到我的本地 /configs/mysql/data 目录,名为 dump.sh,在容器初始化后执行。它包含一个 mysql 命令,可将 my_database_dump.sql 复制到 my_app_database。 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 Dockerfile
在意识到最初的问题是由于构建 cotainer 后卷被 mouted 并且因此在启动时没有使用转储文件(或执行该目录中的任何脚本)来整合数据库之后,第二个解决方案很简单到 将我的 compose-file 中的 volumes 指令移到内置指令上方。这有效并允许我删除 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
我也有这个问题。我在 ./mysql-dump 上安装了一个本地目录,其中包含一个 init.sql 文件,通过 docker-compose 到 docker-entrypoint-initdb.d 卷,该文件会加载到容器中,但不会在容器初始化时执行或填充数据库。 我最初的 docker-compose.yml 看起来像这样:
mysqld:
image: mysql
container_name: mysqld
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/my.cnf
- ./init:/docker-entrypoint-initdb.d
env_file: .env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=fendou
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
但这对我不起作用。
我为这个问题找到了另一个可行的解决方案:
添加 --init-file /data/application/init.sql
到 mysql command.change 以上配置 like
mysqld:
image: mysql
container_name: mysqld
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/my.cnf
# - ./init:/docker-entrypoint-initdb.d
env_file: .env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=fendou
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--init-file /docker-entrypoint-initdb.d/init.sql #attention here
希望对你有所帮助