【问题标题】:Super Slow Docker Build超级慢的 Docker 构建
【发布时间】:2020-04-24 04:24:24
【问题描述】:

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

在这个特定的项目中,运行 docker-compose build 将花费 FOREVER。以前不是这样的,在其他使用 Docker 的项目上,这根本不是问题。并且永远......我说的是大约 10-15 分钟的构建时间,而过去它只需要大约 2 分钟。我有两个独立的同事 DL same repo(一个在 Ubuntu 18 上,另一个在 macOS 14.x 上)。当他们运行build 命令时,整个过程大约需要 2 分钟。这两个人以前从未构建过这个项目,所以他们从头开始。

我已经卸载/重新安装了 Docker,运行了完整的 docker system prune -a,通过 wifi 连接,通过以太网连接,尝试了不同的 wifi 网络,调整了我的 compose 文件,调整了我的 docker 文件——什么都没有。

我的机器是 2018 款 MacBook Pro,配备四核 2.7GHz i7,运行 macOS 10.14.6,安装了 16gb 的 RAM 和 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

这里是引用的 php.dockerfile 文件:

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 和迄今为止发表评论的所有人。我将整个 /docker 构建目录移动到一个测试文件夹中,然后在运行 build 命令之前创建了空的 /web、/moodle 和 /moodledata 目录。它立即开始编译。

让我感到好奇的是,其他同事 DL 使用了与我相同的 Git 存储库,但没有遇到任何相同的问题。哦……想想看……我敢打赌我知道问题出在哪里。

【问题讨论】:

  • 我可以使用 Docker 版本 19.03.3 在 Ubuntu@19.10 上构建您的 php.dockerfile,构建 a872fc2f8 就好了。您正在运行 docker 和 docker-compose 的哪个版本?
  • docker -vdocker-compose version 分别
  • Docker 19.03.5 和 Docker-Compose 1.25.1-rc1 刚刚在 2 分钟内构建了镜像
  • “哦……想想看……我敢打赌我知道问题出在哪里。” ....嗯,那是什么??
  • 嘿,肯,我以为是的,结果完全错了。下面@BMitch 的答案一直是问题所在。一旦我忽略了 /db-data 目录...... bam。就是这样。在那之后就像一个魅力。

标签: php docker docker-compose dockerfile


【解决方案1】:

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

您可以使用与.gitignore 具有几乎相同格式的.dockerignore 来排除在构建时发送的文件。使用 BuildKit(如果您在最新版本的 docker 中 export DOCKER_BUILDKIT=1 启用),它只会在您明确复制文件时发送上下文,并且只有当这些文件从缓存中的可用文件发生更改时才会发送。

有关构建上下文的更多信息,请参阅:https://docs.docker.com/engine/reference/commandline/build/

还有最佳实践:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

【讨论】:

  • 天哪……这完全奏效了。问题在于 /db-data/ 目录的大小为 9gb。我一直在查看我的 /web 文件夹,但我从未想过问题出在源文件夹之外。老实说,今天早上我在其他地方阅读了 .dockerignore 路由后尝试了它,但我认为我的语法只是稍微关闭了。谢谢一百万...我将与我们的开发团队的其他成员分享此信息,并将其纳入我们的整体构建过程。
  • 我也有这个问题。我的 build => 上下文目录不正确,甚至需要 5 分钟才能开始构建。
  • 非常有用的建议!确保您使用项目的.dockerignore 忽略诸如记录包含数千兆字节日志文件的文件夹以防止不必要地被拉入构建上下文(哎呀),并减慢构建速度。您还可以将--verbose 标志传递给docker-compose,以更深入地了解它在做什么,例如调用docker-compose --verbose build,这有助于突出显示它“卡”在哪一步。
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 2020-02-23
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多