You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:10:31