Construcción superlenta de Docker

7 minutos de lectura

avatar de usuario
Dibujó

Creo que me voy a volver loco. He buscado por todas partes y parece que no puedo encontrar una solución que funcione tanto aquí en Stack, GitHub y otros lugares lejanos de las interwebs.

En este proyecto en particular, ejecutando docker-compose build está tomando SIEMPRE. No solía ser así, y en otros proyectos que usan Docker, no es un problema en absoluto. Y para siempre… Estoy hablando de tiempos de construcción de 10 a 15 minutos cuando solía tomar solo alrededor de 2 minutos como máximo. Tuve dos compañeros de trabajo separados DL el mismo repositorio (uno en Ubuntu 18 y el otro en macOS 14.x). Cuando corrieron el build comando, todo el proceso tomó ~ 2 minutos. Ambas personas nunca habían construido este proyecto antes, por lo que estaban comenzando desde cero.

He desinstalado/reinstalado Docker, ejecuté un completo docker system prune -aconectado a través de wifi, conectado a través de Ethernet, probé una red wifi diferente, modifiqué mi archivo de redacción, modifiqué mi archivo docker, nada.

Mi máquina es una MacBook Pro 2018 con un i7 de 2,7 GHz de cuatro núcleos, que ejecuta macOS 10.14.6 con 16 gb de RAM instalada con Docker Desktop 2.1.0.5.

He permitido que Docker Desktop tenga hasta 12 gb o RAM. Durante el proceso de compilación, el uso de la CPU de mi máquina aumenta en promedio del 110 % al 270 % al ejecutar el com.docker.hyperkit proceso.

Para ser claros, está pendiente de los mensajes de estado “Building php” (o “Building web”) antes de que nada realmente comience. Después de eso, el proceso de construcción real se ejecuta sin problemas y rápido.

Aquí está mi docker-compose.yaml expediente:

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

Aquí está el referenciado php.dockerfile expediente:

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

y el referenciado nginx.dockerfile

FROM nginx:stable-alpine

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

WORKDIR /var/www/web

Me está volviendo loco… ¿qué diablos podría estar haciendo mal? Si hay algo que he omitido que les gustaría saber, háganmelo saber y actualizaré la publicación.


ACTUALIZAR

Gracias a @BMitch y a todos los que han comentado hasta ahora. Tomé todo mi directorio de compilación /docker y lo moví a una carpeta de prueba, y luego creé directorios vacíos /web, /moodle y /moodledata antes de ejecutar el build dominio. Comenzó a compilar inmediatamente.

Lo que es curioso para mí es que los otros compañeros de trabajo sacaron el mismo repositorio de Git que yo tengo y no tuvieron ninguno de los mismos problemas. Oooh… Ahora que lo pienso… Apuesto a que sé cuál es el problema.

  • Puedo compilar su php.dockerfile en Ubuntu@19.10 usando Docker versión 19.03.3, compilar a872fc2f8 muy bien. ¿Qué versión de docker y docker-compose está ejecutando?

    – k0pernikus

    6 de enero de 2020 a las 16:15

  • docker -v y docker-compose version respectivamente

    – k0pernikus

    6 de enero de 2020 a las 16:16

  • Docker 19.03.5 y Docker-Compose 1.25.1-rc1 crearon la imagen en menos de 2 minutos

    – Jay Blanchard

    6 de enero de 2020 a las 16:19

  • “Oooh… ahora que lo pienso… apuesto a que sé cuál es el problema”. … bueno, ¿qué fue?

    – saber

    3 de junio de 2020 a las 15:34


  • Oye Ken, lo que pensé que era, resultó ser completamente incorrecto. La respuesta de @BMitch a continuación fue el problema todo el tiempo. Tan pronto como ignoré el directorio /db-data… bam. Eso fue todo. Funcionó como un encanto después de eso.

    – Dibujó

    8 de junio de 2020 a las 14:54

Esto es de su contexto de compilación (que suele ser el directorio donde ejecuta su compilación, pero puede anularse como lo ha hecho en el archivo de redacción). Tiene una gran cantidad de archivos, o archivos grandes, en el directorio de contexto que se envía antes de realizar la compilación.

Puedes usar .dockerignore que tiene un formato casi idéntico a .gitignore para excluir el envío de archivos en la compilación. Y con BuildKit (habilitado si export DOCKER_BUILDKIT=1 en versiones recientes de docker) solo enviará contexto cuando copie archivos explícitamente y luego solo cuando esos archivos hayan cambiado de lo que está disponible en el caché.

Para obtener más información sobre el contexto de compilación, consulte: https://docs.docker.com/engine/reference/commandline/build/

También están las mejores prácticas: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

  • Santas bolas… eso funcionó totalmente. El problema estaba en el directorio /db-data/ que tenía un tamaño de 9 gb. Estuve buscando en mi carpeta /web y nunca se me ocurrió que el problema estaba fuera de la carpeta de origen. Honestamente, probé la ruta .dockerignore esta mañana después de leer sobre ella en otro lugar, pero creo que tenía la sintaxis justo levemente apagado. Un millón de gracias… Compartiré esta información con el resto de nuestro equipo de desarrollo y la incluiré en nuestro proceso de compilación general.

    – Dibujó

    6 de enero de 2020 a las 17:59

  • Yo también tuve este problema. Mi directorio de contexto de compilación => era incorrecto y tomó 5 minutos antes de que comenzara la compilación.

    –Tim Fletcher

    13 de mayo de 2020 a las 4:07

  • ¡Un consejo muy útil! Asegúrese de utilizar su proyecto .dockerignore para ignorar cosas como el registro de carpetas que contienen gigabytes de archivos de registro para evitar que se introduzcan en el contexto de compilación innecesariamente (ups) y ralentizar la compilación a paso de tortuga. También puedes pasar el --verbose bandera a docker-compose para obtener un poco más de información sobre lo que está haciendo, como llamar docker-compose --verbose buildque puede ayudar a resaltar en qué paso está “atascado”.

    – bluebinary

    30 sep 2021 a las 20:58


¿Ha sido útil esta solución?