Mysql 在构建docker映像时初始化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启动之前运行。但我不知道如何正确地

我正在使用图像“mysql”构建一台docker机器。我有一些设置脚本要在机器第一次构建时运行。此安装脚本将创建一些具有指定权限的数据库和数据库用户

以下是我的文件的最小化版本。

pcdb1.entrypoint.sh

Dockerfile

我在日志中发现以下错误

错误2002(HY000):无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地MySQL服务器(2)

pcdb1已退出,代码为1

我所理解的是,我的脚本试图在mysql启动之前运行。但我不知道如何正确地做。我能得到建议吗?

编辑:20181007 我找到了您在讨论中提到的方法--在构建docker映像时初始化DB。但有一点不同,我发现的方法似乎像是在从映像运行容器时初始化DB,尽管初始化脚本是在构建映像时指定的

据该官员称,有一段名为“初始化新实例”。我们只需在目录
/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中是合法的

  • 在主机上获取整个entrypoint.sh脚本
  • 在脚本中添加mysql的自定义,使 此脚本底部的自定义内容。我想你 我不想把它和原始内容混在一起
  • 使用下面的命令和Dockerfile为您自己构建一个新的mysql映像

    命令:docker build-t mysql:self。
    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提供的默认环境: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