【问题标题】:problem with running of mysql image in docker在docker中运行mysql镜像的问题
【发布时间】:2021-04-02 18:44:08
【问题描述】:

我有这样的问题,我正在尝试按照本教程https://developpaper.com/master-slave-replication-of-mysql-based-on-docker/做主从复制。 镜像的构建没有问题,但是运行这个容器有问题。我无法访问 docker 中 mysql 容器的 mysql 命令,它似乎是从 mysql 构建的(来自 docker hub 的图像),但无法启动。 有以下文件:

Dockerfile:

#Using MySQL image to create a new image
FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD Kohc9hai

COPY start.sh /mysql/start.sh
COPY my.cnf /etc/mysql/my.cnf  
COPY init.sql /mysql/init.sql

EXPOSE 6603

CMD ["sh", "/mysql/start.sh"]

init.sql:

--Create data_ Copy database
DROP DATABASE IF EXISTS `data_copy`;
CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */;

--Create person table
USE `data_copy`;
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` int(32) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

my.cnf:

[mysqld]
log-bin = mysql-bin
server-id = 1

start.sh:

#!/bin/sh

echo "start MySQL"
service mysql start
sleep 5

echo "initialize database"
mysql -uroot -pKohc9hai < /mysql/init.sql
echo "initialization complete"
tail -f /dev/null

通过深入,我认为我确定问题出在文件 start.sh 中(也许我错了)。

有这个容器的日志:

start MySQL
mysql: unrecognized service
initialize database
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
initialization complete

也许有人可以帮助我解决这个问题。 我刚开始学习Docker。

【问题讨论】:

    标签: mysql docker dockerfile dockerhub ubuntu-20.04


    【解决方案1】:

    文档很旧(docker 版本 1.13.1!现在是 19.03.13!!)。使用 MySQL 镜像不需要特殊设置。您需要做的就是:

    docker run --name foo -d -p 6603:6603 mysql:latest
    

    【讨论】:

      【解决方案2】:

      mysql: 无法识别的服务

      接下来,你可以看到容器中没有mysql服务,所以你肯定失败了:

      $ docker run --rm mysql ls /etc/init.d
      hwclock.sh
      

      其实mysql image使用next来启动mysql服务:

      exec gosu mysql "$BASH_SOURCE" "$@"
      

      所以你需要遵循同样的方式。

      但是,对于您的场景,看起来您只是自定义 start.sh 来初始化一些 sql,而实际上它已经在官方图像中得到支持:

      初始化一个新的实例
      首次启动容器时,将使用提供的配置变量创建并初始化具有指定名称的新数据库。此外,它将执行 /docker-entrypoint-initdb.d 中的扩展名为 .sh、.sql 和 .sql.gz 的文件。文件将按字母顺序执行。您可以通过将 SQL 转储安装到该目录并提供带有贡献数据的自定义图像来轻松填充您的 mysql 服务。 SQL 文件将默认导入到 MYSQL_DATABASE 变量指定的数据库中。

      所以,你需要做的是在 Dockerfile 中下一步(可能还需要指定 MYSQL_DATABASE):

      COPY init.sql /docker-entrypoint-initdb.d
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-17
        • 2022-10-15
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多