在docker中安装mysql并向外部公开mysql服务

在docker中安装mysql并向外部公开mysql服务,mysql,docker,Mysql,Docker,这些天我在学习docker。我想在docker容器中安装mysql 这是我的文件 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\u mysql.sh apt-get update && DEBIAN_FRONT

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

这是我的文件

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\u 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时发生错误。

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.
如果我删除第二个
sleep5
,命令
service mysql stop
将抛出

ERROR 2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器。

为什么会发生这种情况


谢谢大家!

我强烈建议利用他人的工作。例如,从docker注册表签出Mysql映像:

以下是相关的git存储库文件:

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

.. apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}"* ..
诀窍是认识到数据库实例与数据库软件不是一回事,只是后者附带了映像。创建数据库并用数据加载它们是在运行时完成的。因此,工作由一个额外的脚本完成,该脚本被拉入图像中,并在运行容器时执行设置:

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

希望这有帮助。

将此添加到您的dockerfile:

RUN su
RUN echo exit 0 > /usr/sbin/policy-rc.d
我也面临同样的问题。这段代码修复了它。

是一篇很好的文章,它试图从根本上解决您面临的问题

较短的路径

  • 运行echo“#!/bin/sh\nexit 0”>/usr/sbin/policy rc.d
    可以解决您的问题 或

  • 如果这不能解决问题,请尝试使用
    privileged
    选项运行docker容器。像这样,
    docker-run-privileged-d-ti docker\u IMAGE:TAG

  • 理想情况下,我不建议运行带有
    privileged
    选项的容器,除非它是一个测试台容器。运行具有特权的docker容器的原因为容器提供了所有功能,同时也解除了所有强制执行的限制。换句话说,容器可以执行主机可以执行的几乎所有操作。但这不是一个好的做法。这违背了docker与主机隔离的目的


    理想的方法是根据您想要实现的目标设置docker容器的功能。通过谷歌搜索,这将帮助您为docker容器提供适当的
    功能。

    谢谢Mark。你是对的。但我只想通过一个小例子来学习docker:)@SanLee当然可以。我的观点是,有很多例子可以效仿。在前台运行服务的需求是一个常见的docker“gotcha”:-)是的。现在我可以连接到mysql服务。但是仍然存在两个问题…@Mark如果您能够解释错误消息的来源(我怀疑apt get install正在尝试启动一项服务,但这是不允许的?),以及您的解决方案如何纠正问题,那将非常有帮助(我怀疑它不能防止错误,但可以确保服务作为前台任务而不是守护进程运行)@Trav重构了我的答案。Docker github链接已更改。如果我误导了您,很抱歉。我意识到您的连接失败实际上是在构建过程中发生的,而不是运行时错误。将mysql作为容器启动的一部分安装是错误的。IMO.将安装放在Docker文件中。在Debian官方映像中
    /usr/sbin/policy rc.d
    有一条注释解释了此行为。解决方法是,但对问题和解决方案给出了更好的解释。谢谢!很抱歉迟到了