Docker swarm php-fpm 容器不断重启

问题描述

我创建了一个基本的 LAPP 堆栈,它使用 docker-compose 在本地主机上完美运行。当我尝试让它在生产服务器上与 Swarm 一起运行时(只有 1 个经理,没有工作人员),所有服务都会启动并被复制(1/1),但是 PHP-fpm 不断重启,没有明显错误

docker service ls

ID             NAME                    MODE         REPLICAS   IMAGE                  PORTS
p0rdrdfmso6x   traefik_reverse-proxy   replicated   1/1        traefik:v2.4           *:80->80/tcp,*:443->443/tcp
e6vwlo9iw2ny   my_stack_apache         replicated   1/1        apache:latest          *:8000->80/tcp
qy5yigbcjryr   my_stack_ftp            replicated   1/1        fauria/vsftpd:latest   *:20-21->20-21/tcp,*:22100-22110->22100-22110/tcp
n5f9v6bd2854   my_stack_PHP            replicated   0/1        PHP:latest
rcnbq4vnoz1j   my_stack_postgres       replicated   1/1        postgres:9.5.24

如果我们专注于 PHP-fpm 容器:

docker service ps my_stack_PHP

ID             NAME                  IMAGE        NODE                        DESIRED STATE   CURRENT STATE             ERROR     PORTS
j6mp3ka40cyo   my_stack_PHP.1        PHP:latest   node.address                Ready           Ready 2 seconds ago
ezztpsjoglwy    \_ my_stack_PHP.1    PHP:latest   node.address                Shutdown        Complete 3 seconds ago
gnqjhwpi5y72    \_ my_stack_PHP.1    PHP:latest   node.address                Shutdown        Complete 9 seconds ago
0agr3tw0bb9g    \_ my_stack_PHP.1    PHP:latest   node.address                Shutdown        Complete 15 seconds ago
9a6wsdp4tqqn    \_ my_stack_PHP.1    PHP:latest   node.address                Shutdown        Complete 21 seconds ago

如果我查看日志: docker service logs my_stack_PHP

my_stack_PHP.1.igd8x7a6ysdi@node.address    | Interactive shell
my_stack_PHP.1.57td5iuk1wwy@node.address    | Interactive shell
my_stack_PHP.1.r03jn931l1uf@node.address    | Interactive shell
my_stack_PHP.1.igd8x7a6ysdi@node.address    |
my_stack_PHP.1.r03jn931l1uf@node.address    |
my_stack_PHP.1.1huf2pdd0bq0@node.address    | Interactive shell
my_stack_PHP.1.57td5iuk1wwy@node.address    |
my_stack_PHP.1.1huf2pdd0bq0@node.address    |

它的行为就像一个运行命令的容器,该命令将在几秒钟内以成功结束。 Swarm 然后启动一个新容器来保持重启合约。但是,我的 PHP-fpm Dockerfile 提供了应该保持进程运行的 -F 参数:

PHP Dockerfile

FROM centos:7.4

# ... all installs from Centos to add PHP 7.2 from Remi Collet repositories

RUN mkdir -p /run/PHP-fpm
RUN usermod -a -G ftp apache

workdir /var/www/html

EXPOSE 9000

# Run in foreground as root (in container POV)
CMD ["PHP-fpm","-R","-F"]

docker-compose.yaml

version: '3.9'
services:
  postgres:
    image: "postgres:9.5.24"
    environment:
      POSTGRES_DB: /run/secret/postgres_db
      POSTGRES_USER: /run/secret/postgres_user
      POSTGRES_PASSWORD: /run/secret/postgres_password
    volumes:
      - database:/var/lib/postgresql/data
    secrets:
      - postgres_db
      - postgres_user
      - postgres_password
    deploy:
      resources:
        limits:
          cpus: '0.15'
          memory: 128m
    networks:
      - internal

  apache:
    env_file: .env
    image: apache:latest
    build:
      context: ./docker/images/apache2.4
      dockerfile: prod.Dockerfile
    ports:
      - 8000:80
    environment:
      FPM_HOST: PHP:9000
    volumes:
      - ./docker/logs/apache/:/var/log/httpd/

    networks:
      - traefik-public
      - internal

    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.my_stack.rule=Host(`my-host.com`)"
        - "traefik.http.routers.my_stack.entrypoints=websecure"
        - "traefik.http.routers.my_stack.tls.certresolver=letsencryptresolver"
        - "traefik.http.services.my_stack.loadbalancer.server.port=80"
        - "traefik.port=80"

      resources:
        limits:
          cpus: '0.15'
          memory: 128m
 PHP:
    env_file: .env
    image: PHP:latest
#    links:
#      - ftp
#      - apache
    build:
      context: ./docker/images/PHP
      dockerfile: prod.Dockerfile
#      args:
#        TIMEZONE: 'Europe/Paris'
    volumes:
      - ftp_data:/var/www/ftp:rw


    networks:
      - internal

    deploy:
      resources:
        limits:
          cpus: '0.20'
          memory: 512m

  ftp:
    env_file: .env
    image: "fauria/vsftpd:latest"
    ports:
      - "20:20"
      - "21:21"
      - "22100-22110:22100-22110"
    environment:
      FTP_USER: apache
      FTP_PASS: /run/secret/automation_client_password
      PASV_ADDRESS: 127.0.0.1
      PASV_MIN_PORT: 22100
      PASV_MAX_PORT: 22110
    volumes:
      - ftp_data:/home/vsftpd/apache:rw

    networks:
      - traefik-public
      - internal

    deploy:
      resources:
        limits:
          cpus: '0.15'
          memory: 128m
volumes:
  ftp_data:
  database:

secrets:
  postgres_db:
    external: true
  postgres_user:
    external: true
  postgres_password:
    external: true
  automation_client_password:
    external: true

networks:
  traefik-public:
    external: true
  internal:
    external: false

有人知道这个吗?任何帮助/提示将不胜感激。

解决方法

我不喜欢这种回答,但副本在完全重启后全部上线。