在构建docker映像时初始化db脚本的最佳方法

l5tcr1uw  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(416)

我正在使用“mysql”图像构建一个docker机器。我有一些安装脚本运行的第一次机器是建立。这个安装脚本将创建一些数据库和具有指定权限的数据库用户。
以下是我的文件的最小化版本。。
pcdb1.entrypoint.sh文件


# !/bin/sh

mysql -uroot -p'pass123' -e 'show databases MYENTRYDB;'

dockerfile文件

FROM mysql:5.7

COPY ./pcdb1.entrypoint.sh /
ENTRYPOINT ["/pcdb1.entrypoint.sh"];

日志中出现以下错误
错误2002(hy000):无法通过套接字'/var/run/mysqld/mysqld.sock'(2)连接到本地mysql服务器
pcdb1退出,代码为1
我的理解是,我的脚本试图在mysql启动之前运行。但我不知道该怎么做。我能得到一个建议吗?

vaqhlq81

vaqhlq811#

编辑:20181007

我找到了你提到的方法——在构建docker映像时初始化db。但有一点不同的是,我发现的方法似乎是在从映像运行容器时初始化db,尽管初始化脚本是在构建映像时指定的。
根据官方关于mysql:5.7,有一段名为“初始化一个新示例”。我们可以在目录中添加一个初始化脚本 /docker-entrypoint-initdb.d ,默认值 ENTRYPOINT 以及 CMD 形象的塑造mysql:5.7 would 在数据库启动后执行它。
例如:

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 脚本。如是否使用密码创建根用户、授予根用户权限、使用密码创建用户声明的数据库等 MYSQL_DATABASE 环境等等。

下面是为您提供的解决方案。

自定义docker-entrypoint.sh脚本。

这样,你就可以随心所欲,这在mysql中是合法的。
在主机上获取整个entrypoint.sh脚本。
在脚本中添加自定义的mysql,在脚本的底部添加自定义的内容。我想你不想把它和原始内容混在一起。
使用下面的命令和dockerfile为您自己构建一个新的mysql映像。
命令:docker build-tmysql:self .
dockerfile文件:
从mysql:5.7
复制/path/to/your-entrypoint.sh/
入口点[“/your entrypoint.sh”]
cmd[“mysqld”]
如果你不想要一个新的形象,有另一种方法可以改变 ENTRYPOINT 当你运行一个容器。但是,您仍然应该在容器中提供自己的脚本。
docker run-tid-v/path/to/your entrypoint.sh:/entrypoint.sh-p 3306:3306-e mysql\u root\u password='123'mysql:5.7

使用由提供的默认环境mysql:5.7

这样,就有了一个限度,尤其是你提到的“指定任务”。
您需要的环境包括: MYSQL_DATABASE , MYSQL_USER , MYSQL_PASSWORD .
命令应该是这样的:

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。

相关问题