我正在try 为我的LAMP项目设置Dockerfile,但在启动MySQL时遇到了一些问题.我的Dockerfile上有以下几行:

VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql

但我一直在犯这样的错误:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

关于如何在Dockerfile构建期间设置数据库创建和转储导入,有什么 idea 吗?

推荐答案

Dockerfile中的每个RUN指令在不同的层中执行(如documentation of RUN中所述).

在你的Dockerfile中,你有三条RUN指令.问题是MySQL服务器只在第一个阶段启动.在其他情况下,没有MySQL正在运行,这就是为什么您与mysql客户端发生连接错误的原因.

要解决这个问题,你有两个解决方案.

Solution 1: use a one-line RUN

RUN /bin/bash -c "/usr/bin/mysqld_safe --skip-grant-tables &" && \
  sleep 5 && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /tmp/dump.sql

解决方案2:使用脚本

创建可执行脚本init_db.sh:

#!/bin/bash
/usr/bin/mysqld_safe --skip-grant-tables &
sleep 5
mysql -u root -e "CREATE DATABASE mydb"
mysql -u root mydb < /tmp/dump.sql

将以下几行添加到Dockerfile中:

ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh

Mysql相关问答推荐

SQL条件 Select 和条件WHERE

用于搜索从各种表中获得的结果的查询

MySQL:一个查询中的SELECT语句,用于从一个表中检索所有数据,并仅从另一个表中检索一个数据

当日期附加到MySQL后,如何按日期说明排序?

如何创建一个列,该列在另一个表中具有值的计数?

Mysql 查询返回未定义的 node.js

如何在 WampServer 上重新初始化 MySQL 以允许 lower_case_table_names = 2

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

如何在不使用子查询的情况下按最小日期计算新用户?

正则表达式模式相当于 mysql 中的 %word%

为什么这个 NOT NULL 到 NULL 迁移会触发大量 I/O 操作?

SUBSTRING_INDEX 获取第 n 个值

查询以查找可用时隙

动态创建内联 SQL 表(用于排除左连接)

在 PHP 中获取 MySQL 列的总和

获取Count(*)占GROUP BY中所有项目数的百分比

在 MySQL 中删除数据库返回删除数据库错误:66

将mysql查询输出存储到shell变量中

在 MySQL 中存储 IPv6 地址

与 MySql 的连接正在自动中止.如何正确配置Connector/J?