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

时间:2014-07-28 05:35:19

标签: 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 .

时发生错误
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)

为什么会这样?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

这是关联的git存储库文件:

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

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

诀窍是要意识到数据库实例与数据库软件不同,只有后者随图像一起提供。创建数据库并使用数据加载它是在运行时完成的。因此,工作由额外的脚本完成,拉入图像并在运行容器时执行设置:

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

希望这有帮助。

答案 1 :(得分:0)

将此添加到您的dockerfile:

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

我遇到了同样的问题。这段代码修好了它。

答案 2 :(得分:0)

Here是一个很好的帖子,试图根源导致您面临的问题。

缩短

  1. RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d应解决您的问题  OR

  2. 如果仍无法解决问题,请尝试使用privileged选项运行docker容器。像这样,docker run --privileged -d -ti DOCKER_IMAGE:TAG

  3. 理想情况下,我不建议使用privileged选项运行容器,除非它是一个测试床容器。运行具有特权的docker容器的原因是为容器提供了所有功能,并且它还解除了所有强制执行的限制。换句话说,容器几乎可以完成主机可以执行的所有操作。但这不是一个好习惯。这就破坏了码头从主机隔离的目的。

    执行此操作的理想方法是根据您要实现的目标,对您的docker容器set capabilities。谷歌搜索这应该可以帮助您为您的docker容器提供适当的capability