Mysql 在构建docker映像时初始化DB脚本的最佳方法
我正在使用图像“mysql”构建一台docker机器。我有一些设置脚本要在机器第一次构建时运行。此安装脚本将创建一些具有指定权限的数据库和数据库用户 以下是我的文件的最小化版本。 pcdb1.entrypoint.sh Dockerfile 我在日志中发现以下错误 错误2002(HY000):无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地MySQL服务器(2) pcdb1已退出,代码为1 我所理解的是,我的脚本试图在mysql启动之前运行。但我不知道如何正确地做。我能得到建议吗?编辑:20181007 我找到了您在讨论中提到的方法--在构建docker映像时初始化DB。但有一点不同,我发现的方法似乎像是在从映像运行容器时初始化DB,尽管初始化脚本是在构建映像时指定的 据该官员称,有一段名为“初始化新实例”。我们只需在目录Mysql 在构建docker映像时初始化DB脚本的最佳方法,mysql,dockerfile,Mysql,Dockerfile,我正在使用图像“mysql”构建一台docker机器。我有一些设置脚本要在机器第一次构建时运行。此安装脚本将创建一些具有指定权限的数据库和数据库用户 以下是我的文件的最小化版本。 pcdb1.entrypoint.sh Dockerfile 我在日志中发现以下错误 错误2002(HY000):无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地MySQL服务器(2) pcdb1已退出,代码为1 我所理解的是,我的脚本试图在mysql启动之前运行。但我不知道如何正确地
/docker entrypoint initdb.d
中添加一个初始化脚本,image mysql:5.7的默认entrypoint
和CMD
将在数据库启动后执行
例如:
FROM mysql:5.7
COPY init-database.sql /docker-entrypoint-initdb.d/
init-database.sql的内容:
create database light;
create user 'light'@'%' identified by 'abc123';
grant all privileges on light.* to 'light'@'%' identified by 'abc123';
grant all privileges on light.* to 'light'@'localhost' identified by 'abc123';
建立新形象:
docker build -t light/mysql:5.7 .
运行容器:
docker run -tid --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD='abc123' light/mysql:5.7
检查初始化:
docker run -ti mysql /bin/bash
root@25e73d40c4ff:/# mysql -uroot -p
Enter password: (abc123)
Welcome to the MySQL monitor.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
一切都很好
前面的答案如下。
如何在容器中启动mysql damon?
首先,您在“尝试在mysql启动之前运行”部分是正确的。但仍然缺少“MySQL是如何准确启动的”。如果执行docker history mysql:5.7--no trunc
,您可以在输出中看到三条重要记录,如下所示:
/bin/sh -c #(nop) CMD ["mysqld"]
/bin/sh -c #(nop) ENTRYPOINT ["docker-entrypoint.sh"]
/bin/sh -c ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh
到目前为止,我们应该知道当我们使用下面的命令启动mysql容器时,容器中确切的初始命令是docker-entrypoint.sh mysqld
docker run -tid -e MYSQL_ROOT_PASSWORD='abc123' mysql:5.7
如何在容器中启动mysql?
其次,现在让我们检查一下docker entrypoint.sh
脚本。在这个脚本的大致中间位置有一行,如下所示,这意味着启动mysql守护进程
mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )
启动mysql后,我们可以在docker entrypoint.sh
脚本中看到许多启动语句。如是否使用密码创建root用户、授予root权限、使用MYSQL\u database
env创建用户声明的数据库等
下面是为您提供的解决方案。
自定义docker entrypoint.sh
脚本。
通过这种方式,你可以随心所欲,这在mysql中是合法的
Dockerfile:
来自mysql:5.7
复制/path/to/your-entrypoint.sh/
入口点[“/您的入口点.sh”]
CMD[“mysqld”]
ENTRYPOINT
运行容器时。但是,您仍然应该在容器中提供自己的脚本。docker run-tid-v/path/to/your entrypoint.sh:/entrypoint.sh-p 3306:3306-e MYSQL\u ROOT\u PASSWORD='abc123'MYSQL:5.7
您需要的环境是:
MYSQL\u数据库
,MYSQL\u用户
,MYSQL\u密码
命令应如下所示:
docker run -tid -e MYSQL_ROOT_PASSWORD='abc123' -e MYSQL_DATABASE='apps' -e MYSQL_USER='light' -e MYSQL_PASSWORD='abc123' mysql:5.7
这意味着将自动创建数据库apps
和用户light
,并向用户light
授予数据库apps
的超级用户权限
更多关于hub.docker.com的参考。mysql:5.7映像已经有了自己的docker文件和入口点脚本,它将使用这些文件构建映像、启动mysql并初始化它。当我正在构建一台新的docker机器时,是否有任何方法可以在上面添加我自己的初始化脚本?供您参考,我正在使用docker compose创建我的机器。因为这有一些客户脚本,所以我指向docker compose中我自己的dockerfile。yml@BlueBird正如您所说,mysql已经有了一个n入口点:5.7。您需要自定义初始化脚本,因此可以修改或替换它。据我所知,似乎没有别的办法。可能有,也可能没有。@BlueBird我已经更新了答案,这就是您想要的吗?请注意,如果:1)您将sql脚本放入
/docker entrypoint initdb.d/
,2)您已装入一个用于db持久化的卷,那么该卷也必须删除。
mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )
docker run -tid -e MYSQL_ROOT_PASSWORD='abc123' -e MYSQL_DATABASE='apps' -e MYSQL_USER='light' -e MYSQL_PASSWORD='abc123' mysql:5.7