首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL拒绝主机IP,除非我手动重新启动它

问MySQL拒绝主机IP,除非我手动重新启动它
EN

Stack Overflow用户
提问于 2017-03-14 03:24:44
回答 3查看 1.1K关注 0票数 7

这是我的Dockerfile:

代码语言:javascript
复制
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"]

入口点:

代码语言:javascript
复制
#!/bin/bash

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

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

代码语言:javascript
复制
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时,MySQL才会开始接受外部主机。我得运行/etc/init.d/mysql restart。只有这样,我才能使用MySQL客户端成功地从主机连接。

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

如何才能从主机连接到在容器中运行的MySQL实例,而不必手动重新启动MySQL?

Docker版本1.12.1,构建23cf638

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-19 08:18:57

我想出了一种方法,可以在开始时应用跳过-授予-表选项。

解决办法

在docker-entrypoint.sh中,我将/etc/init.d/mysql start更改为

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

其他变动

由于my.cnf中已经有了一个my.cnf部分,所以我在Dockerfile RUN 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 stop; /etc/init.d/mysql start保留了‘跳过-授予-表’选项。

票数 2
EN

Stack Overflow用户

发布于 2017-03-17 05:02:16

我猜MySQL已经在您安装之后启动了,运行sed来更改配置不会生效。入口点有mysql start,但是它可能看到MySQL已经在运行,什么也不做了。尝试将该命令更改为mysql restart,以便您的入口点bash脚本变成:

代码语言:javascript
复制
#!/bin/bash

/etc/init.d/mysql restart
/etc/init.d/redis-server start
/etc/init.d/elasticsearch start
/bin/bash
票数 0
EN

Stack Overflow用户

发布于 2017-03-20 06:57:38

您正在使用跳过-授予-表标志登录没有密码。我认为,由于/etc/init.d/mysql脚本的某些原因,在第一次启动时会忽略标志,从而拒绝了来自root@192.168.99.1的连接。我相信码头工人与这件事无关。

要回答您的问题,您不必手动重新启动,您可以将您的入口点改为:

代码语言:javascript
复制
#!/bin/bash
/etc/init.d/mysql start
# Wait for mysql to be fully up, then restart (e.g., 5 seconds)
sleep 5
/etc/init.d/mysql restart
/etc/init.d/redis-server start
/etc/init.d/elasticsearch start
/bin/bash

或者,不要使用/etc/init.d/mysql start,而是直接调用mysqld

代码语言:javascript
复制
#!/bin/bash
mysqld &
/etc/init.d/redis-server start
/etc/init.d/elasticsearch start
/bin/bash

此外,虽然在[mysqld]中再创建一个my.cnf组并不是一个问题,但是您应该在现有组中添加新的配置:

代码语言:javascript
复制
RUN sed -i '/\[mysqld\]/a skip-grant-tables' /etc/mysql/my.cnf

关于启动/停止Mysql服务器的几种方法,请参考医生

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42777239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档