Php 超慢速Docker构建

Php 超慢速Docker构建,php,docker,docker-compose,dockerfile,Php,Docker,Docker Compose,Dockerfile,我想我要发疯了。我已经到处搜索了,在Stack、GitHub和其他远程互联网站上似乎都找不到有效的解决方案 在这个特定的项目中,运行docker compose build需要花费很长时间。过去不是这样的,在其他使用Docker的项目中,这根本不是问题。直到永远。。。我说的是10-15分钟的构建时间,而过去它最多只需要2分钟。我有两个独立的同事在同一个repo上工作(一个在Ubuntu 18上,另一个在macOS 14.x上)。当他们运行build命令时,整个过程耗时约2分钟。这两个人以前从来没

我想我要发疯了。我已经到处搜索了,在Stack、GitHub和其他远程互联网站上似乎都找不到有效的解决方案

在这个特定的项目中,运行
docker compose build
需要花费很长时间。过去不是这样的,在其他使用Docker的项目中,这根本不是问题。直到永远。。。我说的是10-15分钟的构建时间,而过去它最多只需要2分钟。我有两个独立的同事在同一个repo上工作(一个在Ubuntu 18上,另一个在macOS 14.x上)。当他们运行
build
命令时,整个过程耗时约2分钟。这两个人以前从来没有建造过这个项目,所以他们从零开始

我卸载/重新安装了Docker,运行了一个完整的
Docker系统删减-a
,通过wifi连接,通过以太网连接,尝试了不同的wifi网络,调整了我的撰写文件,调整了我的Docker文件——什么都没有

我的机器是2018款MacBook Pro,四核2.7GHz i7,运行macOS 10.14.6,安装16gb内存,Docker Desktop 2.1.0.5

我已经允许Docker Desktop最多有12gb或RAM。在构建过程中,运行
com.docker.hyperkit
进程时,我的机器cpu使用率平均从110%上升到270%

明确地说,在任何事情真正开始之前,它就挂在“Building php”(或“Building web”)状态消息上。在这之后,实际的构建过程将平稳而快速地运行

这是我的docker compose.yaml文件:

version: '3.1'

services:
  db:
    container_name: clientsname.db
    hostname: db
    image: mariadb:10.4.1-bionic
    volumes:
      - ./db-data:/var/lib/mysql:delegated
    ports:
      - 3307:3306
    environment:
      MYSQL_DATABASE: my_database
      MYSQL_USER: my_user
      MYSQL_PASSWORD: my_pass
      MYSQL_ROOT_PASSWORD: my_pass

  php:
    container_name: clientsname.php
    hostname: php
    build:
      dockerfile: php/php.dockerfile
      context: ./
    environment:
      XDEBUG_CONFIG: remote_host=${REMOTE_HOST}

    volumes:
      - ../web:/var/www/web
      - ../moodle:/var/www/moodle
      - ../moodledata:/var/www/moodledata
      - ./php/custom.ini:/usr/local/etc/php/conf.d/zzz-custom.ini
      - ./php/z-errors.ini:/usr/local/etc/php/conf.d/z-errors.ini:delegated
      - ./php/z-upload.ini:/usr/local/etc/php/conf.d/z-upload.ini:delegated
      - ./php/z-xdebug.ini:/usr/local/etc/php/conf.d/z-xdebug.ini:delegated
    depends_on:
      - db

  web:
    container_name: clientsname.web
    hostname: web
    build:
      dockerfile: nginx/nginx.dockerfile
      context: ./
    volumes:
      - ../web:/var/www/web
      - ../moodle:/var/www/moodle
      - ../moodledata:/var/www/moodledata
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/ssl:/etc/nginx/ssl
      - ./logs:/var/log/nginx
    ports:
      - 80:80
      - 443:443
    depends_on:
      - php
      - db

FROM php:7.2.26-fpm
LABEL maintainer="My Clients Name"

# Environment variables
ENV DEBIAN_FRONTEND=noninteractive
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV COMPOSER_NO_INTERACTION=1
ENV COMPOSER_HOME=/usr/local/share/composer

# Working Directory
WORKDIR /var/www/web
WORKDIR /var/www/moodle
WORKDIR /var/www/moodledata


RUN rm /etc/apt/preferences.d/no-debian-php && apt-get update && apt-get install -y --no-install-recommends apt-utils \
        build-essential     \
        php-soap            \
        libzip-dev          \
        libmagickcore-dev   \
        libmagickwand-dev   \
        libmagic-dev        \
        libpng-dev          \
        libfreetype6-dev    \
        libjpeg62-turbo-dev \
        libmcrypt-dev       \
        libmemcached-dev    \
        zlib1g-dev          \
        nano                \
        sudo                \
        gnupg               \
        curl                \
        unzip &&            \
    docker-php-ext-install soap pdo_mysql mysqli && \
    docker-php-ext-install -j$(nproc) gd iconv && \
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
    pecl install zip-1.15.2 imagick memcached-3.0.4 xdebug && \
    docker-php-ext-enable memcached imagick zip xdebug

# Install Composer, Node, Gulp, and SASS
RUN curl -s https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer

RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - && apt-get install -y nodejs && npm install npm@latest -g && npm install --global gulp-cli && npm config set unsafe-perm=true


# Export composer vendor path
RUN echo "" >> ~/.bashrc && echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> ~/.bashrc

以下是引用的php.dockerfile文件:

version: '3.1'

services:
  db:
    container_name: clientsname.db
    hostname: db
    image: mariadb:10.4.1-bionic
    volumes:
      - ./db-data:/var/lib/mysql:delegated
    ports:
      - 3307:3306
    environment:
      MYSQL_DATABASE: my_database
      MYSQL_USER: my_user
      MYSQL_PASSWORD: my_pass
      MYSQL_ROOT_PASSWORD: my_pass

  php:
    container_name: clientsname.php
    hostname: php
    build:
      dockerfile: php/php.dockerfile
      context: ./
    environment:
      XDEBUG_CONFIG: remote_host=${REMOTE_HOST}

    volumes:
      - ../web:/var/www/web
      - ../moodle:/var/www/moodle
      - ../moodledata:/var/www/moodledata
      - ./php/custom.ini:/usr/local/etc/php/conf.d/zzz-custom.ini
      - ./php/z-errors.ini:/usr/local/etc/php/conf.d/z-errors.ini:delegated
      - ./php/z-upload.ini:/usr/local/etc/php/conf.d/z-upload.ini:delegated
      - ./php/z-xdebug.ini:/usr/local/etc/php/conf.d/z-xdebug.ini:delegated
    depends_on:
      - db

  web:
    container_name: clientsname.web
    hostname: web
    build:
      dockerfile: nginx/nginx.dockerfile
      context: ./
    volumes:
      - ../web:/var/www/web
      - ../moodle:/var/www/moodle
      - ../moodledata:/var/www/moodledata
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/ssl:/etc/nginx/ssl
      - ./logs:/var/log/nginx
    ports:
      - 80:80
      - 443:443
    depends_on:
      - php
      - db

FROM php:7.2.26-fpm
LABEL maintainer="My Clients Name"

# Environment variables
ENV DEBIAN_FRONTEND=noninteractive
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV COMPOSER_NO_INTERACTION=1
ENV COMPOSER_HOME=/usr/local/share/composer

# Working Directory
WORKDIR /var/www/web
WORKDIR /var/www/moodle
WORKDIR /var/www/moodledata


RUN rm /etc/apt/preferences.d/no-debian-php && apt-get update && apt-get install -y --no-install-recommends apt-utils \
        build-essential     \
        php-soap            \
        libzip-dev          \
        libmagickcore-dev   \
        libmagickwand-dev   \
        libmagic-dev        \
        libpng-dev          \
        libfreetype6-dev    \
        libjpeg62-turbo-dev \
        libmcrypt-dev       \
        libmemcached-dev    \
        zlib1g-dev          \
        nano                \
        sudo                \
        gnupg               \
        curl                \
        unzip &&            \
    docker-php-ext-install soap pdo_mysql mysqli && \
    docker-php-ext-install -j$(nproc) gd iconv && \
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
    pecl install zip-1.15.2 imagick memcached-3.0.4 xdebug && \
    docker-php-ext-enable memcached imagick zip xdebug

# Install Composer, Node, Gulp, and SASS
RUN curl -s https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer

RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - && apt-get install -y nodejs && npm install npm@latest -g && npm install --global gulp-cli && npm config set unsafe-perm=true


# Export composer vendor path
RUN echo "" >> ~/.bashrc && echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> ~/.bashrc

以及引用的nginx.dockerfile

FROM nginx:stable-alpine

RUN apk add --update bash && rm -rf /var/cache/apk/*

WORKDIR /var/www/web

这让我快疯了。。。我到底做错了什么?如果有什么我遗漏了,你们都想知道,请让我知道,我会更新帖子


更新

感谢@BMitch和你们所有到目前为止发表评论的人。在运行
build
命令之前,我将整个/docker构建目录移到一个测试文件夹中,然后创建了空的/web、/moodle和/moodledata目录。它立即开始编译


让我感到好奇的是,其他同事也发行了与我相同的Git回购,但没有任何相同的问题。哦。。。想想看。。。我敢打赌,我知道问题出在哪里。

这是从构建上下文(通常是运行构建的目录,但可以像在撰写文件中那样被覆盖)。在执行生成之前发送的上下文目录中有大量文件

您可以使用与
.gitignore
格式几乎相同的
.dockrignore
来排除在生成时发送的文件。使用BuildKit(如果您在DOCKER的最新版本中导出DOCKER\u BuildKit=1,则启用此功能),它仅在您显式复制文件时发送上下文,然后仅在这些文件与缓存中可用的文件发生更改时发送上下文

有关生成上下文的详细信息,请参阅:


还有一些最佳实践:

我可以在上面构建您的php.dockerfileUbuntu@19.10使用Docker版本19.03.3,构建a872fc2f8即可。您正在运行docker和docker compose的哪个版本?
docker-v
docker compose版本
docker 19.03.5和docker compose 1.25.1-rc1刚刚在2分钟内构建了映像只是出于好奇:如果删除一些卷,它会更快吗?如果是,它们可能很大还是包含很多文件?你能构建我的灯堆栈吗?神圣的球。。。这完全奏效了。问题在于大小为9gb的/db data/目录。我一直在查看我的/web文件夹,但从未想到问题出在源文件夹之外。老实说,今天早上我在其他地方读到关于.dockrignore的文章后,尝试了它,但我想我的语法有点不对劲。非常感谢。。。我将与我们的开发团队的其他成员分享这些信息,并将其应用到我们的整个构建过程中。我也有这个问题。我的build=>context目录不正确,需要5分钟才能启动构建。