Docker MySQL容器无法等待MySQL服务器就绪

时间:2018-05-31 12:22:58

标签: mysql docker

我正在尝试使用mysql:5 docker镜像创建一个docker容器。一旦MySQL服务器启动并运行,我想创建一些数据库,用户和表。

我的Dockerfile看起来像这样;

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
 ---&GT; 0d16d0a97dd1
步骤2/7:运行mkdir / server_data
 ---&GT;使用缓存
 ---&GT; 087b5ded3a53
步骤3/7:WORKDIR / server_data
 ---&GT;使用缓存
 ---&GT; 5a32ea1b0a49
步骤4/7:ADD --chown =“root:root”./ db.data。
 ---&GT;使用缓存
 ---&GT; 5d453c52a9f1
步骤5/7:COPY ./setup setup
 ---&GT; 9c5359818748
步骤6/7:COPY ./config /etc/mysql/conf.d
 ---&GT; b663a380813f
步骤7/7:CMD [“./ setup / setup.sh”,“mysql”,“ - u”,“root”,“&lt;”,“。/ setup / skipmaql”]  ---&GT;在4535b2620141中运行 移除中间容器4535b2620141
 ---&GT; 2d2fb7e308ad
成功建成2d2fb7e308ad
成功标记了wasdbsandbox_db:最新的 重新创建数据库......完成了 附加到db
db | ERROR 2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2) db | mysql不可用 - 睡觉
db | ERROR 2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2) db | mysql不可用 - 睡觉

这是无休止的,直到我按下Ctrl + c。

如果我在Dockerfile中注释掉CMD行,那么运行'docker-compose up --build'的输出就是官方mysql Dockerfile中定义的ENTRYPOINT命令的输出。

为什么当我使用自己的CMD命令时,mysql永远不会启动?

1 个答案:

答案 0 :(得分:2)

官方的mysql映像已经支持了这一点。无需制作自己的自定义解决方案。

查看&#34;初始化新实例&#34;下的Docker Hub README

您可以在5.7 Dockerfile(例如)that it copies in a ENTRYPOINT script下的官方图片中看到。该脚本不会在构建时运行,但是在CMD启动守护程序之前的运行时。

在现有的ENTRYPOINT脚本中,您会看到/docker-entrypoint-initdb.d/放入it will process any files

简而言之,当你从现有的官方形象开始一个新容器时,它将:

  1. 以仅本地模式启动mysqld
  2. 创建默认用户,db,pw等
  3. 运行您放入/docker-entrypoint-initdb.d/
  4. 的所有脚本
  5. 停止mysqld并切换到Dockerfile CMD
  6. CMD将运行mysqld来侦听网络