这些天我正在学习码头工人。我想在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)
为什么会这样?
谢谢!
答案 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是一个很好的帖子,试图根源导致您面临的问题。
缩短:
RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d
应解决您的问题
OR
如果仍无法解决问题,请尝试使用privileged
选项运行docker容器。像这样,docker run --privileged -d -ti DOCKER_IMAGE:TAG
理想情况下,我不建议使用privileged
选项运行容器,除非它是一个测试床容器。运行具有特权的docker容器的原因是为容器提供了所有功能,并且它还解除了所有强制执行的限制。换句话说,容器几乎可以完成主机可以执行的所有操作。但这不是一个好习惯。这就破坏了码头从主机隔离的目的。
执行此操作的理想方法是根据您要实现的目标,对您的docker容器set capabilities
。谷歌搜索这应该可以帮助您为您的docker容器提供适当的capability
。