我正在尝试使用mysql:5 docker 形象。一旦mysql服务器启动并运行,我想创建一些数据库、用户和表。
我的文件是这样的;
FROM mysql:5
# Add db.data with correct permissions
RUN mkdir /server_data
WORKDIR /server_data
ADD --chown="root:root" ./db.data .
# Copy setup directory
COPY ./setup setup
COPY ./config /etc/mysql/conf.d
CMD ["./setup/setup.sh", "mysql", "-u", "root", "<", "./setup/schema.sql"]
我的./setup/setup.sh脚本如下所示;
# !/bin/bash
# wait-for-mysql.sh
set -e
shift
cmd="$@"
until mysql -uroot -c '\q'; do
>&2 echo "mysql is unavailable - sleeping"
sleep 1
done
>&2 echo "mysql is up - executing command"
exec $cmd
我的docker-compose.yml看起来像这样;
version: "3"
services:
db:
build: ./db
volumes:
- data-db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
restart: always
container_name: db
volumes:
data-db:
当我运行“docker compose up--build”时,我得到以下输出:;
建筑配电箱
步骤1/7:从mysql:5
--->0d16d0a97dd1型
步骤2/7:运行mkdir/server\u data
--->使用缓存
--->087b5ded3a53型
第3/7步:workdir/服务器数据
--->使用缓存
--->5a32ea1b0a49型
步骤4/7:添加--chown=“root:root“,/db.数据。
--->使用缓存
--->5d453c52a9f1型
第5/7步:复制/设置
--->9c5359818748型
步骤6/7:copy./config/etc/mysql/conf.d
--->b663a380813f
第7/7步:cmd[“.”/setup/setup.sh”,“mysql”,“-u”,“root”,“<”,“.”/setup/schema.sql”]
--->磨合4535b2620141
拆卸中间容器4535b2620141
--->2d2fb7e308ad型
成功构建2d2fb7e308ad
已成功标记wasdsandbox\u db:latest
正在重新创建数据库。。。完成
连接到db
db | error 2002(hy000):无法通过socket'/var/run/mysqld/mysqld.sock'连接到本地mysql服务器(2)db | mysql不可用-休眠
db | error 2002(hy000):无法通过socket'/var/run/mysqld/mysqld.sock'连接到本地mysql服务器(2)db | mysql不可用-休眠
这种情况一直持续到我按下ctrl+c。
如果我在dockerfile中注解掉cmd行,那么运行“docker compose up--build”的输出就是正式mysql dockerfile中定义的entrypoint命令的输出。
当我使用自己的cmd命令时,为什么mysql从不启动?
1条答案
按热度按时间qnyhuwrf1#
官方mysql映像已经支持这一点。不需要自己定制解决方案。
请看“初始化新示例”下的docker hub自述文件。
您可以在5.7 dockerfile(例如)下的官方图片中看到它在入口点脚本中复制。该脚本不会在构建时运行,而是在cmd启动守护进程之前的运行时运行。
在现有的entrypoint脚本中,您将看到它将处理您放入的任何文件
/docker-entrypoint-initdb.d/
因此,简而言之,当您从现有的官方图像启动一个新容器时,它将:以仅本地模式启动mysqld
创建默认用户、db、pw等。
运行你输入的任何脚本
/docker-entrypoint-initdb.d/
停止mysqld并将其交给dockerfile cmdcmd将运行mysqld来监听网络