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