首页 > 解决方案 > GCP Cloud 运行容器服务:[pool www] 无法写入套接字 '/run/php-fpm/www.sock' 的 ACL

问题描述

我在 AWS ECS fargate 上运行基于 Web 的容器化应用程序已有几个月了。但由于 AWS 的一些问题,我的团队计划将它与 GCP 结合使用多云。因此,当在 GCP Cloud Run 上部署我的容器映像时,它会给我这个错误

ERROR: [pool www] failed to write the ACL of the socket '/run/php-fpm/www.sock': Operation not permitted (1)" 
ERROR: FPM initialization failed

然后我尝试使用 /run/php-fpm 更改权限

chmod 777 -R /run/php-fpm

它再次向我显示相同的错误
在我在本地运行容器并执行到容器中以检查 www.sock 文件之后,它的权限是

srw-rw----+ root root www.sock

/run/php-fpm 的权限是

drwxrwxrwx. root root php-fpm

之后我尝试更改权限

chmod 777 -R /run/php-fpm/*

在 docker 文件中,但它给了我一个文件不存在的错误
我也尝试使用 setfacl 但是当我执行到容器中并在本地检查它时,www.sock 的权限没有改变,并且在部署在云上运行时给出相同的错误
我不想迁移到天蓝色,所以我只需要云运行的解决方案。我正在使用端口 80 向 docker 文件公开
这是我的 dockerfile

FROM amazonlinux:2
# Environment variables
ENV PORT 80
# Install dependencies
RUN amazon-linux-extras install php7.2
RUN yum clean metadata && yum update -y && \
    yum install -y \
    curl \
    httpd httpd-tools\
    git \
    openssh-server \
    openssh-clients \
    php-cli php-pdo php-fpm php-json \
    php-bcmath \
    php-cli \
    php-common \
    php-dba \
    php-devel \
    php-embedded \
    php-enchant\
    php-gd\
    php-intl \
    php-lda\
    php-mbstrin\
    php-mysqlnd \
    php-odbc \
    php-pd\
    php-pear.noarch \
    php-pgsql\
    php-process \
    php-pspel \
    php-recode \
    php-snmp \
    php-soap \
    php-xml \
    php-xmlrpc \
    php-mbstring \
    unzip \
 && ln -s /usr/sbin/httpd /usr/sbin/apache2 \
 && curl -sS https://getcomposer.org/installer | php \
 && mv composer.phar /usr/local/bin/composer \
 && ln -s /usr/local/bin/composer /usr/bin/composer
COPY github_key .
COPY httpd.conf /etc/httpd/conf/httpd.conf
# Install app
RUN rm -rf /var/www/html/* && mkdir -p /var/www/html
# git clone command
#few sed commands
WORKDIR /var/www/html/
RUN composer require mpdf/mpdf && \
chmod 777 -R vendor/mpdf/mpdf/tmp
EXPOSE $PORT
ENTRYPOINT ["sh", "-c", "/usr/sbin/php-fpm && /usr/sbin/apache2 -DFOREGROUND"]

标签: phpapachedockergoogle-cloud-platformgoogle-cloud-run

解决方案


好吧,经过大量搜索并找到了线索,我得到了解决方案。大多数在线解决方案建议在 /etc/php-fpm.d/www.conf 中设置值

;listen.owner = nginx 
;listen.group = nginx 
listen.acl_users = apache, nginx 
listen.acl_groups = apache, nginx 

但这不起作用为了在 Cloud Run 完美部署,我们必须评论listen.acl_userslisten.acl_groups

;listen.acl_users = apache, nginx
;listen.acl_groups = apahce, nginx

为此,我在 Dockerfile 中使用 sed 命令

RUN sed -i 's/listen.acl_users/;listen.acl_users/g' /etc/php-fpm.d/www.conf
RUN sed -i 's/listen.acl_groups/;listen.acl_groups/g' /etc/php-fpm.d/www.conf

之后,我的应用程序将完美地部署在 Cloud Run 上,但在 AWS ECS Fargate 上开始出现错误。所以,我最终为每个服务制作了 2 个不同的 Dockerfile。


推荐阅读