mysql - Docker:MySQL 拒绝主机 IP,除非我手动重新启动它

标签 mysql docker

这是我的 Dockerfile:

FROM debian:jessie-backports

RUN apt-get update --yes && apt-get upgrade --yes
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ 
  git \
  curl \
  build-essential\
  libssl-dev\
  ca-certificates\
  mysql-server\
  redis-server\
  elasticsearch

USER root

ENV HOME /root

# MYSQL SETUP
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/#bind-address = 0.0.0.0/" /etc/mysql/my.cnf
RUN sed -i -e"s/^#max_connections\s*=\s*100/max_connections = 200/" /etc/mysql/my.cnf
RUN echo "\n[mysqld]\nskip-grant-tables\n" >> /etc/mysql/my.cnf
VOLUME ["/var/lib/mysql", "/var/log/mysql"]

EXPOSE 3306

# REDIS SETUP
RUN echo "daemonize yes\nbind 0.0.0.0" >> /etc/redis/redis-serve.conf

RUN sed 's/^daemonize no/daemonize yes/' -i /etc/redis/redis.conf \
 && sed 's/^bind 127.0.0.1/bind 0.0.0.0/' -i /etc/redis/redis.conf \
 && sed 's/^# unixsocket /unixsocket /' -i /etc/redis/redis.conf \
 && sed 's/^# unixsocketperm 755/unixsocketperm 777/' -i /etc/redis/redis.conf \
 && sed '/^logfile/d' -i /etc/redis/redis.conf

VOLUME ["/var/lib/redis", "/var/log/redis"]

EXPOSE 6379 6380

# ELASTICSEARCH SETUP

RUN sed 's/^#START_DAEMON=true/START_DAEMON=true/' -i /etc/default/elasticsearch

VOLUME ["/opt/elasticsearch/data", "/opt/elasticsearch/logs"]

EXPOSE 9200 9300

ADD docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

入口点:

#!/bin/bash

/etc/init.d/mysql start
/etc/init.d/redis-server start
/etc/init.d/elasticsearch start
/bin/bash

以及我正在运行的启动容器的命令:

docker run -i -t -p 3306:3306 -p 6379:6379 -p 9200:9200 -p 9300:9300 assethost

我想从主机连接到容器中运行的 MySQL 服务器,但是当我尝试连接时会发生这种情况:

ERROR 1130 (HY000): Host '192.168.99.1' is not allowed to connect to this MySQL server

Redis 和 Elasticsearch 都可以很好地暴露自己。只有当我从运行容器时从入口点出现的 Bash shell 手动重新启动 MySQL 时,MySQL 才会开始接受外部主机。我必须运行 /etc/init.d/mysql restart。只有这样,我才能使用 MySQL 客户端从主机成功连接。

请注意,我使用的是 docker-machine,因此我必须为 MySQL 客户端提供主机 IP 才能连接。

如何在不手动重启 MySQL 的情况下从主机连接到容器中运行的 MySQL 实例?

Docker 版本 1.12.1,构建 23cf638

最佳答案

我想出了一种方法来让 skip-grant-tables 选项在启动时应用。

解决方法

在 docker-entrypoint.sh 中,我改变了 /etc/init.d/mysql start

HOME=/etc/mysql/usr/bin/mysqld_safe >/dev/null 2>&1 &

其他变化

由于 my.cnf 中已经有 [mysqld] 部分,我在 Dockerfile 中更改了以下行 运行 echo "\n[mysqld]\nskip-grant-tables\n">>/etc/mysql/my.cnf

RUN sed -i '/\[mysqld\]/a skip-grant-tables\nskip-name-resolve'/etc/mysql/my.cnf

我添加了 skip-name-resolve,因此 mysql 不会尝试解析本地 IP 地址的名称。

注意事项

/etc/init.d/mysql restart 被执行时,变通方法不再有效,但是 /etc/init.d/mysql 停止;/etc/init.d/mysql start 保留了“skip-grant-tables”选项。

关于mysql - Docker:MySQL 拒绝主机 IP,除非我手动重新启动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42777239/

相关文章:

php - 如果相同的 id 重复,如何获取总和

mysql - 在同一个查询 MySQL 上选择 Distinct 和 Count

docker - 多个 RUN 指令与单个 CMD 执行 Dockerfile 中的设置脚本以初始化容器

docker - 如何从 docker hub 上的私有(private) docker 存储库中提取?

插入触发器后的 MySQL 获取自动增量值,插入后更新字段值给出 "Unknown column"错误

php - 如何从三个表中获取没有重复行的记录?

mysql - 获取未读消息的数量

azure - 504 :Gateway Timeout in Web App using Docker

docker - 如何使用 htdigest 创建用户而不提示输入密码

docker - hcsshim:超时等待通知额外信息