docker mysql容器无法等待mysql服务器就绪

6fe3ivhb  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(440)

我正在尝试使用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从不启动?

qnyhuwrf

qnyhuwrf1#

官方mysql映像已经支持这一点。不需要自己定制解决方案。
请看“初始化新示例”下的docker hub自述文件。
您可以在5.7 dockerfile(例如)下的官方图片中看到它在入口点脚本中复制。该脚本不会在构建时运行,而是在cmd启动守护进程之前的运行时运行。
在现有的entrypoint脚本中,您将看到它将处理您放入的任何文件 /docker-entrypoint-initdb.d/ 因此,简而言之,当您从现有的官方图像启动一个新容器时,它将:
以仅本地模式启动mysqld
创建默认用户、db、pw等。
运行你输入的任何脚本 /docker-entrypoint-initdb.d/ 停止mysqld并将其交给dockerfile cmd
cmd将运行mysqld来监听网络

相关问题