【问题标题】:centos7: Operation not permitted - mysqlcentos7:不允许操作 - mysql
【发布时间】:2019-05-27 12:05:21
【问题描述】:

我已经在centOS 中安装了mysql,现在想启动mysql-server。但是,我得到了那个错误:

# systemctl start mysqld
Failed to get D-Bus connection: Operation not permitted

为了修复它,我创建了一个如图所示的 Dockerfile

FROM centos:7
MAINTAINER theodosiostziomakas <mymail@gmail.com>
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i 
== systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

然后运行它来创建一个图像。

$ docker build --rm -t local/c7-systemd .

但我仍然遇到同样的错误。

我也看过这个proposed solution

有什么想法吗?

谢谢, 西奥。

【问题讨论】:

  • Docker 镜像通常没有 systemctl,因此当它们在 docker 中运行时,启动应用程序的方法通常会发生变化。官方 mysql 映像使用启动脚本来引导 mysql,而不是 init 脚本。您可能也想这样做(或者只使用对我来说非常有用的官方 mysql 映像)。
  • 你好,丹。我认为它远不止这些......
  • @DanFarrell 你的意思是你用 mysql 镜像从 centOS 启动 mysql-server 对吧?
  • 您应该假设 systemd 和像 systemctlinitctlservice 这样的命令在 Docker 中不起作用。如果您的目标是拥有一个 MySQL 容器,stock mysql image 是一个很好的起点。通常,您直接将服务作为前台命令运行,无需任何类型的初始化系统。
  • @Theo I 不会花时间让初始化系统在 docker 中运行。没有特别令人信服的理由这样做 - 我会重新启动 container 而不是登录并进行传统的服务管理。我会尽量让它与主机操作系统完全分离并避免特权模式。我也会让我的容器保持短暂的状态,并专注于确保我理解为什么当容器消失时我的数据会被保留。除了启用不适用于 docker 范式的传统管理技术之外,我真的不明白 init 的作用。

标签: mysql docker centos7


【解决方案1】:

我认为是 Dockerfile 或运行命令的问题

您的 Dockerfile 中的问题似乎在这一行

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \

这里是 MySQL centos Dockerfile

# Starting from base CentOS image
FROM centos:7

# Enabling SystemD
ENV container docker

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]

# Enabling EPEL & Remi repo
#RUN yum install -y epel-release && \
#yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm 

# Mysql repo & installion
RUN yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm && \
yum install -y mysql mysql-server

RUN chkconfig --level 345 mysqld on
RUN systemctl enable  mysqld


VOLUME [ "/var/lib/mysql" ]

# Port Expose
EXPOSE 3306
CMD ["/usr/sbin/init"]

现在,下一步是运行

--privileged is not enough, you also need to mount cgroup

这是命令

docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -it adilm7177/centos-mysql

您可以自己构建,也可以从我在测试期间构建和推送的 docker 注册表中提取上述图像。

docker push adilm7177/centos-mysql:latest

更新:

RUN systemctl enable  mysqld

添加后,我可以使用systemctl 开始-停止

【讨论】:

  • 聪明。但归根结底,我想知道它增加了什么价值。作为对其他读者的说明,我鼓励您追求“每个容器一个进程”的范式,而不是试图让传统的管理系统在 docker 中运行。
  • @DanFarrell 它对我有用,所以我暂时保留它。
  • @DanFarrell 新年快乐,取得了很多成功和幸福。
  • 祝所有@Theo 新年快乐
【解决方案2】:

我可以使用docker-systemctl-replacement 脚本很好地运行 mysql,该脚本在没有活动 systemd 守护程序的情况下模拟“systemctl”命令。您可以查看 docker-systemctl-images 示例。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2020-12-22
    • 2017-06-27
    • 2018-03-20
    • 2016-11-22
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多