Сверхскоростная Docker сборка - PullRequest
2 голосов
/ 06 января 2020

Я думаю, что схожу с ума go. Я искал все и не могу найти работающего решения и здесь, в стеке, на GitHub и в других удаленных областях.

В этом конкретном проекте запуск docker-compose build занимает НАВСЕГДА . Так не было раньше, и в других проектах, использующих Docker, это не проблема. И навсегда ... Я говорю около 10-15 минут времени сборки, когда раньше это занимало всего около 2 минут. У меня было два отдельных сотрудника DL того же репо (один на Ubuntu 18, а другой на macOS 14.x). Когда они запустили команду build, весь процесс занял ~ 2 минуты. Оба эти человека никогда не создавали этот проект раньше, поэтому они начинали с нуля.

Я удалил / переустановил Docker, запустил полный docker system prune -a, подключенный через Wi-Fi, подключенный через Ethe rnet, пробовал другую сеть wifi, подправил мой файл compose, подправил мой файл docker - ничего.

Моя машина представляет собой MacBook Pro 2018 года с четырехъядерным процессором i7 с частотой 2,7 ГГц и MacOS 10.14.6 с 16 ГБ установленной оперативной памяти с Docker Desktop 2.1.0.5.

У меня есть разрешено Docker Рабочий стол иметь до 12 ГБ или ОЗУ. Во время процесса сборки загрузка моего компьютера в среднем увеличивается с 110% до 270% при выполнении процесса com.docker.hyperkit.

Для ясности, он висит на "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 file:

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 и переместил его в тестовую папку, а затем создал пустые каталоги / web, / moodle и / moodledata перед выполнением команды build. Он сразу начал компилироваться.

Что мне любопытно, так это то, что другие коллеги DL имели тот же репо Git, что и у меня, и не имели никаких подобных проблем. Оооо ... если подумать ... Держу пари, я знаю, в чем проблема.

1 Ответ

4 голосов
/ 06 января 2020

Это из контекста вашей сборки (это часто каталог, в котором вы запускаете сборку, но его можно переопределить, как вы это сделали в файле compose). У вас есть большое количество файлов или большие файлы в контекстном каталоге, который отправляется перед выполнением сборки.

Вы можете использовать .dockerignore, формат которого почти идентичен .gitignore, чтобы исключить файлы из отправляется на стройку. А с BuildKit (включенным, если вы export DOCKER_BUILDKIT=1 в последних версиях docker) он будет отправлять контекст только при явном копировании файлов и только тогда, когда эти файлы изменились по сравнению с тем, что доступно в кэше.

Для получения дополнительной информации о контексте сборки см .: https://docs.docker.com/engine/reference/commandline/build/

Также есть лучшие практики: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

...