Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

371
Views
Docker: MySQL refuses host IP unless I restart it manually

Here is my 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"]

The entrypoint:

#!/bin/bash

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

And the command I'm running to start the container:

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

I want to connect to the MySQL server running in the container from the host, but this is what happens when I try to connect:

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

Both Redis and Elasticsearch expose themselves just fine. MySQL will only begin accepting external hosts if I restart it manually from the Bash shell that comes up from the entrypoint when I run the container. I have to run /etc/init.d/mysql restart. Only then, can I successfully connect from the host using the MySQL client.

Note that I am using docker-machine, so I have to give the MySQL client the host IP in order to connect.

How can I be able to connect from the host to the MySQL instance running in the container without having to manually restart MySQL?

Docker version 1.12.1, build 23cf638

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

I figured out a way to get the skip-grant-tables option to be applied on start.

Workaround

In docker-entrypoint.sh, I changed /etc/init.d/mysql start to

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

Other changes

Since there was already a [mysqld] section in my.cnf, I changed the following line in Dockerfile RUN echo "\n[mysqld]\nskip-grant-tables\n" >> /etc/mysql/my.cnf

to

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

I added skip-name-resolve so mysql doesn't attempt to resolve names for local ip addresses.

Caveats

The workaround no longer works when /etc/init.d/mysql restart is executed, but /etc/init.d/mysql stop; /etc/init.d/mysql start preserved the 'skip-grant-tables' option.

over 4 years ago · Santiago Trujillo Report

0

I'm guessing MySQL has already started after your installation and running sed to change configuration won't take effect. Entry point you have has mysql start but it is probably seeing that MySQL is already running and not doing anything. Try changing that command to mysql restart, so your entry point bash script becomes:

#!/bin/bash

/etc/init.d/mysql restart
/etc/init.d/redis-server start
/etc/init.d/elasticsearch start
/bin/bash
over 4 years ago · Santiago Trujillo Report

0

You're using skip-grant-tables flag to login without password. I think due to some reasons of /etc/init.d/mysql script, the flag is ignored on the first start, making the connection from the root@192.168.99.1 rejected. I believe Docker has nothing to do with this issue.

To answer your question, you don't have to restart by hand, you can change your entrypoint to either:

#!/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

Or, don't use /etc/init.d/mysql start, instead invoke mysqld directly

#!/bin/bash
mysqld &
/etc/init.d/redis-server start
/etc/init.d/elasticsearch start
/bin/bash

In addition, although creating one more [mysqld] group in my.cnf is not an issue, you should append new configuration to the existing group:

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

Refer the doc for several ways to start/stop Mysql server

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!