Cuando la ventana acoplable inicia el servicio, genera el registro lento de PHP ERROR: no se pudo rastrear (ADJUNTAR) niño 24: Operación no permitida (1)

1. Descripción del error 

Después de usar docker-compose para iniciar el contenedor, acceda al servidor a través del navegador y descubra que sigue dando vueltas, verifique el registro lento de php-fpm lento y encuentre el siguiente error:

[31-May-2023 12:02:34] ERROR: failed to ptrace(ATTACH) child 12: Operation not permitted (1)
[31-May-2023 12:02:34] WARNING: [pool www] child 12, script '/www/index.php' (request: "GET /index.php") executing too slow (5.021099 sec), logging

2. Motivo del error 

Esto se debe a un problema de permiso del contenedor Docker

El contenedor php implementado en docker no puede ;

        En el sistema Linux, PHP-FPM usa SYS_PTRACE para rastrear el proceso de trabajo , y ¿qué es SYS_PTRACE? ( Este es un privilegio operativo en las capacidades de Linux ), entonces, ¿qué son las capacidades de Linux? A partir del kernel 2.2, Linux divide los privilegios tradicionalmente asociados con el superusuario root en diferentes unidades llamadas capacidades.Las capacidades existen como atributos de subprocesos (Linux realmente no distingue entre procesos e subprocesos) , y cada unidad se puede habilitar y deshabilitar de forma independiente.         De esta manera, el proceso de verificación de permisos se convierte en: al realizar una operación privilegiada, si la identidad efectiva del proceso no es root, verificar si tiene las capacidades correspondientes a la operación privilegiada y luego determinar si la operación privilegiada se puede realizar .

        Por lo tanto, en el contenedor docker, php debe tener la capacidad CAP_KILL para escribir registros lentos. Al configurar la hora del sistema, debe tener la capacidad CAP_SYS_TIME. Esta función no está habilitada de forma predeterminada en el contenedor docker, lo que genera problemas.

3. Soluciones

Cuando se inicie el contenedor, agregue el parámetro --cap -add SYS_PTRAC E

(1) A través del comando --security-opt seccomp=unconfined

Violencia simple (no recomendada), cierre la configuración de seccomp directamente, uso:

docker run --security-opt seccomp:unconfined ...

(2) Agregue –cap-add=SYS_PTRACE al iniciar la ventana acoplable

Use --cap-add para agregar explícitamente capacidades específicas:

docker run --cap-add=SYS_PTRACE ...

(3) Solución en Docker Compose

Docker Compose es compatible con cap_add desde la versión 1.1.0 (2015-02-25), documento oficial: cap_add, cap_drop .Uso en docker-compose.yml :

version: "3"

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
        volumes:
            - "${PROJECT_ROOT}:/var/www"
            - "${VHOST_ROOT}:/etc/nginx/conf.d"
        networks:
            - server
        depends_on:
            - php
        cap_add:
          - SYS_PTRACE
    php:
        build: ./php-fpm/
        expose:
            - 9000
        volumes:
            - "${PROJECT_ROOT}:/var/www"
            - "/etc/crontab:/etc/crontab"
        links:
            - redis
#            - sphinx
            - mysql
            - mongo
        networks:
            - server
        cap_add:
          - SYS_PTRACE
#    sphinx:
#        build: ./sphinx/
#        ports:
#            - 9312:9312
#        networks:
#            - server

    redis:
        build: ./redis/
        ports:
            - 6379:6379
        networks:
            - server
    mysql:
        build: ./mysql
        ports:
            - 3306:3306
        volumes:
            - ./mysql/conf:/etc/mysql/conf.d
            - ./mysql/data:/var/lib/mysql
        restart: always
        networks:
            - server
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_USER: user
            MYSQL_PASSWORD: 123456

    rabbitmq:
        hostname: rabbit01
        environment:
            RABBITMQ_DEFAULT_VHOST: "/"
            RABBITMQ_DEFAULT_USER: "user"
            RABBITMQ_DEFAULT_PASS: "123456"
            TZ: 'Asia/Shanghai'
            RABBITMQ_ERLANG_COOKIE: 'rabbitmqCookie'
        image: "rabbitmq:3.7.16-management"
        restart: always
        networks:
            - server
        volumes:
        - "./rabbitmq:/var/lib/rabbitmq"
        - "./rabbitmq/log:/var/log/rabbitmq/log"
        ports:
        - "15672:15672"
        - "4369:4369"
        - "5672:5672"
        - "25672:25672"

    mongo:
        build:
            context: ./mongo
        ports:
            - "27017:27017"
        #container_name: mongo
        environment:
            AUTH: "yes"
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: 123456
        volumes: #数据卷映射
            - /mongo/mongod.conf:/etc/mongod.conf  #这里做配置文件的映射,想通过配置文件开启数据库的权限验证,但好像没有效果,后面在研究下
            - /mongo/data:/data/db
            - /mongo/logs/:/var/log/mongodb
        #command: mongodb
        restart: always
        privileged: true
        networks:
            - server

    #mongodb可视化工具:部署完后,需开放对应端口号
    mongo-express:
        image: mongo-express
        restart: always
        links:
            - mongo
        depends_on:
            - mongo
        ports:
            - "28017:8081"
        networks:
            - server
        environment:
            #注意: 冒号后面需要有对应的空格,不然docker-compose安装会报错,fuck!
            ME_CONFIG_MONGODB_ADMINUSERNAME: root
            ME_CONFIG_MONGODB_ADMINPASSWORD: 123456
            ME_CONFIG_BASICAUTH_USERNAME: root
            ME_CONFIG_BASICAUTH_PASSWORD: b123456
            ME_CONFIG_MONGODB_URL: mongodb://root:123456@mongo:27017/


networks:
    server:

Bien, problema resuelto

Pero hay una cosa más a la que debe prestar atención aquí : al agregar , preste atención al procesamiento de espacios , de lo contrario, se informará el siguiente error al iniciar docker-compose:

ERROR: yaml.parser.ParserError: while parsing a block mapping   in "./docker-compose.yml", line 1, column 1 expected <block end>, but found '<block mapping start>'   in "./docker-compose.yml", line 31, column 7

Causa del error: Desalineación por espacios (alineación en sentido estricto)
Solución: Agregar o eliminar espacios correspondientes a la posición línea 31, columna 7, para que se mantenga la alineación de la misma capa, aquí se recomienda editar docker- redacte primero en el editor .yml y luego envíelo al servidor

Supongo que te gusta

Origin blog.csdn.net/zhoupenghui168/article/details/132090741
Recomendado
Clasificación