在docker中安装mysql并将mysql服务暴露给外部

这些天我正在学习docker工。 我想在Docker容器中安装mysql。

这是我的Dockerfile

FROM ubuntu:14.04 ADD ./setup_mysql.sh /setup_mysql.sh RUN chmod 755 /setup_mysql.sh RUN /setup_mysql.sh EXPOSE 3306 CMD ["/usr/sbin/mysqld"] 

和shell脚本setup_mysql.sh

 apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server sed -i -e "s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf service mysql start & sleep 5 echo "UPDATE mysql.user SET password=PASSWORD('rootpass') WHERE user='root'" | mysql echo "CREATE DATABASE devdb" | mysql echo "GRANT ALL ON devdb.* TO devuser @'%' IDENTIFIED BY 'devpass'" | mysql sleep 5 service mysql stop 

运行sudo docker build -t test/devenv .时会发生错误sudo docker build -t test/devenv .

 Setting up mysql-server-5.5 (5.5.38-0ubuntu0.14.04.1) ... invoke-rc.d: policy-rc.d denied execution of stop. invoke-rc.d: policy-rc.d denied execution of start. 

如果我删除第二次sleep 5 ,命令service mysql stop将抛出

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

为什么会这样呢?

谢谢!

我高度推荐利用他人的工作。 例如,从Dockerregistry中签出Mysql映像:

这里是关联的git仓库文件:

如果你看看Dockerfile,你会注意到软件正在按照预期安装:

 .. apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}"* .. 

诀窍是认识到数据库实例与数据库软件不一样,只有后者随图像一起提供。 创build数据库并使用数据加载它们是在运行时完成的。 所以这个工作是由一个额外的脚本来完成的,当你运行这个容器的时候,这个脚本被拉入到镜像中,

 COPY docker-entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] 

希望这可以帮助。

将此添加到您的dockerfile中:

 RUN su RUN echo exit 0 > /usr/sbin/policy-rc.d 

我面临同样的问题。 这段代码修正了它。