我正在使用“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启动之前运行。但我不知道该怎么做。我能得到一个建议吗?
1条答案
按热度按时间vaqhlq811#
编辑:20181007
我找到了你提到的方法——在构建docker映像时初始化db。但有一点不同的是,我发现的方法似乎是在从映像运行容器时初始化db,尽管初始化脚本是在构建映像时指定的。
根据官方关于mysql:5.7,有一段名为“初始化一个新示例”。我们可以在目录中添加一个初始化脚本
/docker-entrypoint-initdb.d
,默认值ENTRYPOINT
以及CMD
形象的塑造mysql:5.7 would 在数据库启动后执行它。例如:
init-database.sql的内容:
建立新形象:
运行容器:
检查初始化:
一切都很顺利。
前面的答案如下。
如何在容器中启动mysql-damon?
首先,您在“在mysql启动之前尝试运行”部分是对的。但是,仍然缺少一个关于“mysql到底是如何启动的”。如果你执行
docker history mysql:5.7 --no-trunc
,您可以在输出中看到三条重要记录,如下所示:到目前为止,我们应该知道当我们用下面的命令启动一个mysql容器时,容器中确切的初始命令是
docker-entrypoint.sh mysqld
.如何在容器中启动mysql?
第二,现在让我们检查一下
docker-entrypoint.sh
脚本。下面有一行具体的代码,就在这个脚本的大致中间位置,这意味着启动mysql守护进程。
在启动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
.命令应该是这样的:
这意味着数据库
apps
和用户light
将自动创建light
将被授予数据库的超级用户权限apps
.更多参考请访问hub.docker.com。