Mac M1构建CentOS7 x86_64带systemd的Docker镜像失败求助
问题描述
参考Docker Hub的「Systemd integration」文档创建带systemd的CentOS7镜像,基础镜像Dockerfile如下:
FROM centos:7 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"]
构建命令指定x86_64平台:
docker build --platform linux/x86_64 --rm -t local/c7-systemd .
接着构建含httpd的子镜像,Dockerfile:
FROM local/c7-systemd RUN yum -y install httpd; yum clean all; systemctl enable httpd.service EXPOSE 80 CMD ["/usr/sbin/init"]
构建命令:
docker build --platform linux/x86_64 --rm -t local/c7-systemd-httpd .
运行容器时执行:
docker run --platform linux/x86_64 -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd
出现错误:
Failed to mount tmpfs at /run: Operation not permitted Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted [!!!!!!] Failed to mount API filesystems, freezing.
需求是构建CentOS7 x86_64架构下,包含Apache和PHP8.1的容器。
解决方案
1. 修正容器运行参数
systemd在Docker容器中运行需要特定权限和挂载设置,修改运行命令如下:
docker run --platform linux/x86_64 -ti \ --privileged \ -v /sys/fs/cgroup:/sys/fs/cgroup:rw \ -v /run:/run:tmpfs \ -p 80:80 \ local/c7-systemd-httpd
核心参数说明:
--privileged:授予容器足够权限,解决systemd挂载文件系统的权限限制/sys/fs/cgroup改为rw挂载:systemd需要对cgroup目录进行读写管理- 显式挂载
/run为tmpfs:直接解决错误中tmpfs挂载失败的问题
2. 构建包含PHP8.1的镜像
CentOS7默认软件源无PHP8.1,需添加Remi仓库。修改子镜像Dockerfile如下:
FROM local/c7-systemd # 安装依赖仓库 RUN yum -y install epel-release https://rpms.remirepo.net/enterprise/remi-release-7.rpm && \ # 启用PHP8.1专属仓库 yum-config-manager --enable remi-php81 && \ # 安装Apache、PHP8.1及常用扩展 yum -y install httpd php php-cli php-fpm php-mysqlnd php-gd php-xml php-mbstring && \ yum clean all && \ # 设置开机自启服务 systemctl enable httpd.service php-fpm.service EXPOSE 80 CMD ["/usr/sbin/init"]
构建命令保持不变:
docker build --platform linux/x86_64 --rm -t local/c7-systemd-httpd-php81 .
3. 验证容器运行
运行新构建的镜像:
docker run --platform linux/x86_64 -ti \ --privileged \ -v /sys/fs/cgroup:/sys/fs/cgroup:rw \ -v /run:/run:tmpfs \ -p 80:80 \ local/c7-systemd-httpd-php81
进入容器后可通过以下命令检查服务状态:
systemctl status httpd php-fpm
也可在主机创建PHP信息文件验证:
在容器内执行:
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
主机访问http://localhost/info.php即可查看PHP8.1的配置信息。
内容的提问来源于stack exchange,提问作者Irshad Muhmmed A R
相关产品推荐
相关产品推荐

