Как заставить Docker выполнять чистую сборку без использования кэша?
Я создаю Docker-образ с помощью команды:
docker build -t u12_core -f u12_core .
Когда я пересобираю с той же командой, Docker использует кэш сборки, как показано в выводе ниже:
Step 1 : FROM ubuntu:12.04
---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <pavan.gupta@gmail.com>
---> Using cache
---> 4354ccf9dcd8
Step 3 : RUN apt-get update
---> Using cache
---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
---> Using cache
---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
---> Using cache
---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
---> Using cache
---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
---> Using cache
---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
---> Using cache
---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
---> Using cache
---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
---> Using cache
---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
---> Using cache
---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
---> Using cache
---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
---> Using cache
---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
---> Using cache
---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
---> Using cache
---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
---> Using cache
---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
---> Using cache
---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
---> Using cache
---> 25f5fe70fa84
Successfully built 25f5fe70fa84
Кэш показывает, что aerospike установлен. Однако я не нахожу его внутри контейнеров, созданных из этого образа, поэтому я хочу пересобрать этот образ без использования кэша. Как заставить Docker пересобрать чистый образ без кэша?
Чтобы заставить Docker выполнить чистую сборку без использования кэша, вам нужно добавить флаг --no-cache в команду сборки. В вашем конкретном случае команда будет выглядеть так:
docker build --no-cache -t u12_core -f u12_core .
Этот флаг указывает Docker игнорировать любые закэшированные слои и пересобрать образ с нуля, гарантируя, что все шаги будут выполнены заново, независимо от того, кажутся ли они неизменными.
Содержание
- Понимание кэша Docker
- Основные методы для чистых сборок
- Использование флага --no-cache
- Альтернативные подходы
- Решение с использованием Docker Compose
- Лучшие практики
Понимание кэша Docker
Кэширование сборки Docker предназначено для ускорения процесса сборки путем хранения промежуточных слоев. Когда вы запускаете docker build, Docker проверяет каждый шаг против кэша. Если шаг не изменился, Docker использует закэшированную версию вместо пересборки. Именно поэтому вы видите сообщения “Using cache” в выводе сборки.
Однако, как вы, вероятно, обнаружили, это поведение кэширования иногда может приводить к несоответствиям, когда контейнер не отражает ожидаемое состояние, несмотря на показ закэшированных слоев в процессе сборки.
Основные методы для чистых сборок
Использование флага --no-cache
Наиболее прямое решение - использование флага --no-cache. Согласно Cloudbees, “Использование опции **–no-cache в Docker заставляет процесс сборки контейнера пропустить все закэшированные слои”".
Для вашей конкретной команды:
docker build --no-cache -t u12_core -f u12_core .
Это будет:
- Заставить Docker выполнить каждый шаг сборки
- Загружать свежие базовые образы при необходимости
- Создавать совершенно новые слои образа
- Игнорировать все существующие записи кэша
Примечание: Чистые сборки занимают больше времени, так как Docker не может использовать какие-либо закэшированные слои, но они обеспечивают полную согласованность между вашим Dockerfile и результирующим образом.
Альтернативные подходы
Использование --pull с --no-cache
Иногда вы можете захотеть также принудительно выполнить свежий pull базового образа. В этом случае объедините оба флага:
docker build --no-cache --pull -t u12_core -f u12_core .
Как отмечает один пользователь Stack Overflow, “Опция --pull решила мою проблему. Только --no-cache, сборка все равно не работала. Добавил --pull, и сборка заработала!”"
Использование аргументов для обхода кэша
Для более контролируемого сброса кэша вы можете использовать аргументы сборки с изменяющимися значениями. Как демонстрирует Bomberbot:
docker build -t u12_core -f u12_core --build-arg CACHEBUST=$(date +%s) .
Этот подход:
- Добавляет временную метку в качестве аргумента сборки
- Сбрасывает кэш для этого слоя и всех последующих слоев
- Позволяет кэшировать неизменные базовые слои
- Предоставляет более детальный контроль над сбросом кэша
Решение с использованием Docker Compose
Если вы используете docker-compose, решение аналогично, но с немного другим синтаксисом:
docker-compose build --no-cache
Или для конкретного сервиса:
docker-compose build --no-cache u12_core
Лучшие практики
-
Стратегически используйте --no-cache: Хотя это и заманчиво, избегайте использования
--no-cacheдля каждой сборки, так как это значительно замедляет процесс сборки. -
Изолируйте шаги для обхода кэша: Размещайте аргументы сборки или команды, которые часто меняются, в конце вашего Dockerfile, чтобы минимизировать влияние на производительность сборки.
-
Рассмотрите оптимизацию слоев: Проверьте ваш Dockerfile, чтобы убедиться, что вы следуете лучшим практикам для слоев Docker. Это может помочь уменьшить необходимость частого сброса кэша.
-
Регулярная очистка кэша: Периодически очищайте неиспользуемый кэш Docker для экономии дискового пространства:
bashdocker system prune -a
Флаг --no-cache должен решить вашу непосредственную проблему с установкой aerospike, не появляющейся в контейнерах, так как он заставляет выполнить полную пересборку каждого слоя с нуля.
Источники
- How to Use Docker Build Without Cache for Clean Builds - Cloudbees
- How to force Docker for a clean build of an image - Stack Overflow
- Docker Cache – How to Do a Clean Image Rebuild and Clear Docker’s Cache - Medium
- docker build --no-cache | Build docker without cache - GoLinuxCloud
- How to Make Docker Rebuild an Image Without Its Cache - HowToGeek
- Docker Cache – How to Do a Clean Image Rebuild and Clear Docker’s Cache - Bomberbot
Заключение
Чтобы заставить Docker выполнить чистую сборку без кэша, просто добавьте флаг --no-cache в команду сборки. Это гарантирует, что Docker пересоберет каждый слой с нуля, решая проблему несоответствия, с которой вы сталкиваетесь при установке aerospike. Для вашего конкретного случая использования выполните:
docker build --no-cache -t u12_core -f u12_core .
Помните, что чистые сборки занимают больше времени, но гарантируют полную согласованность между вашим Dockerfile и результирующим образом. Рассмотрите возможность использования техник обхода кэша или оптимизации структуры вашего Dockerfile для лучшей производительности в рабочих процессах разработки.