首页 > 解决方案 > 为什么 docker 同步文件与地图文件夹的速度非常慢?(Ubuntu)

问题描述

在我的本地机器(Ubuntu 18.04、8GB RAM、i5、HDD)上,我的 laravel 项目有两个 docker-compose 文件

码头工人-compose.yml

version: '3.7'

networks:
  backend-network:
    driver: bridge
  frontend-network:
    driver: bridge

services:
  &app-service app: &app-service-template
    container_name: k4fntr_app
    build:
      context: ./docker/php-fpm
      args:
        UID: ${UID?Use your user ID}
        GID: ${GID?Use your group ID}
        USER: ${USER?Use your user name}
    user: "${UID}:${GID}"
    hostname: *app-service
    volumes:
      - /etc/passwd/:/etc/passwd:ro
      - /etc/group/:/etc/group:ro
      - ./:/var/www/k4fntr
    environment:
      APP_ENV: "${APP_ENV}"
      CONTAINER_ROLE: app
      FPM_PORT: &php-fpm-port 9000
      FPM_USER: "${UID:-1000}"
      FPM_GROUP: "${GID:-1000}"
    networks:
      - backend-network

  &queue-service queue:
    <<: *app-service-template
    container_name: k4fntr_queue
    restart: always
    hostname: *queue-service
    depends_on:
      - app
    environment:
      CONTAINER_ROLE: queue

  &schedule-service schedule:
    <<: *app-service-template
    container_name: k4fntr_schedule
    restart: always
    hostname: *schedule-service
    depends_on:
      - app
    environment:
      CONTAINER_ROLE: scheduler

  &sportlevel-listener sportlevel_listener:
    <<: *app-service-template
    container_name: k4fntr_sl_listener
    restart: always
    hostname: *sportlevel-listener
    ports:
      - "${SPORTLEVEL_LISTEN_PORT}:${SPORTLEVEL_LISTEN_PORT}"
    depends_on:
      - app
    environment:
      CONTAINER_ROLE: sl_listener

  &php-fpm-service php-fpm:
    <<: *app-service-template
    container_name: k4fntr_php-fpm
    user: 'root:root'
    restart: always
    hostname: *php-fpm-service
    ports: [*php-fpm-port]
    entrypoint: /fpm-entrypoint.sh
    command: php-fpm --nodaemonize
    networks:
      - backend-network
      - frontend-network

  echo-server:
    container_name: k4fntr_echo
    image: oanhnn/laravel-echo-server
    volumes:
     - ./:/app
    environment:
      GENERATE_CONFIG: "false"
    depends_on:
      - app
    ports:
      - "6001:6001"
    networks:
      - backend-network
      - frontend-network

  redis:
    container_name: k4fntr_redis
    image: redis
    restart: always
    command: redis-server
    volumes:
      - ./docker/redis/config/redis.conf:/usr/local/etc/redis/redis.conf
      - ./docker/redis/redis-data:/data:rw
    ports:
      - "16379:6379"
    networks:
      - backend-network

和 docker-compose-dev.yml

version: '3.7'

volumes:
  redis-data:
  pg-data:
  k4fntr_sync:
    external: true

services:
  &app-service app: &app-service-template
    container_name: k4fntr_app
    build:
      context: ./docker/php-fpm
      args:
        UID: ${UID?Use your user ID}
        GID: ${GID?Use your group ID}
        USER: ${USER?Use your user name}
    user: "${UID}:${GID}"
    hostname: *app-service
    volumes:
      - /etc/passwd/:/etc/passwd:ro
      - /etc/group/:/etc/group:ro
      - k4fntr_sync:/var/www/k4fntr:nocopy
    environment:
      APP_ENV: "${APP_ENV}"
      CONTAINER_ROLE: app
      FPM_PORT: &php-fpm-port 9000
      FPM_USER: "${UID:-1000}"
      FPM_GROUP: "${GID:-1000}"
    networks:
      - backend-network

  &php-fpm-service php-fpm:
    <<: *app-service-template
    container_name: k4fntr_php-fpm
    user: 'root:root'
    restart: always
    hostname: *php-fpm-service
    ports: [*php-fpm-port]
    entrypoint: /fpm-entrypoint.sh
    command: php-fpm --nodaemonize -d "opcache.enable=0" -d "display_startup_errors=On" -d "display_errors=On" -d "error_reporting=E_ALL"
    networks:
      - backend-network
      - frontend-network

  mail:
    container_name: k4fntr_mail
    image: mailhog/mailhog
    ports:
      - "1025:1025"
      - "8025:8025"
    networks:
      - backend-network

  nginx:
    container_name: k4fntr_nginx
    image: nginx
    volumes:
      - ./docker/nginx/config/default:/etc/nginx/conf.d
      - k4fntr_sync:/var/www/k4fntr:nocopy
    depends_on:
      - *php-fpm-service
    ports:
      - "${NGINX_LISTEN_PORT}:80"
    networks:
      - frontend-network

  database:
    container_name: k4fntr_database
    build: ./docker/postgres
    restart: always
    environment:
      ENV: ${APP_ENV}
      TESTING_DB: ${DB_DATABASE_TESTING}
      POSTGRES_DB: ${DB_DATABASE}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    ports:
      - "15432:5432"
    volumes:
      - ./docker/postgres/prod/:/prod
      - ./docker/postgres/pg-data:/var/lib/postgresql/data:rw
    networks:
      - backend-network

问题是当我更改项目中的一些文件时,我必须等待很多时间。从 15 到 40 秒。本地发展是不可能的。我怎么解决这个问题?

我学到了一些与其他操作系统(如 Mac 或 Windows)有类似问题的信息,但我在 Linux 上找不到同样的问题。

标签: laraveldockerdocker-compose

解决方案


问题是我认为第二个文件(docker-compose-dev.yml)覆盖了第一个文件。我的意思是 php-fpm 部分。如果你看一下 docker-compose-dev 你可以看到有命令

command: php-fpm --nodaemonize -d "opcache.enable=0" -d "display_startup_errors=On" -d "display_errors=On" -d "error_reporting=E_ALL"

实际上我使用了第一个文件(非常强烈,因为我使用了命令

docker-compose -f docker-compose-dev.yml -f docker-compose.yml up

) 并且我的 opcache 被缓存了。这是我不得不等待这么长时间的主要原因


推荐阅读