Я построил образ Docker из файла Docker с помощью приведенной ниже команды.
$ docker build -t u12_core -f u12_core .
Когда я пытаюсь перестроить его с помощью той же команды, он использует кеш сборки, например:
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
Кеш показывает что аэроспайк установлен. Однако я не нахожу его внутри контейнеров, порожденных этим изображением, поэтому я хочу перестроить это изображение без использования кэша. Как заставить Docker восстановить чистый образ без кеша?
RUN
директив.RUN
директивы, поэтомуDockerfile
со многимиRUN
директивами потребовалось бы огромное количество дискового пространства; но это, по-видимому, несколько улучшилось в последних версиях.docker-compose up -d
, где я могу использовать--no-cache
?docker-compose build --no-cache
а потомdocker-compose up -d
Ответы:
Там есть
--no-cache
вариант:В старых версиях Docker вам нужно было пройти
--no-cache=true
, но это уже не так.источник
--no-cache
работает сdocker-compose build
.--pull
. Это скажет докеру получить последнюю версию базового образа. Это необходимо в дополнение к тому,--no-cache
если у вас уже есть базовый образ (например,ubuntu/latest
), и базовый образ был обновлен с момента последнего его извлечения. Смотрите документы здесь .--pull
вариант сделал свое дело для меня. Просто--no-cache
, сборка еще сломалась. Положите,--pull
а построить работает! Спасибо!В некоторых крайних случаях единственным способом избежать повторяющихся сбоев сборки является:
Команда запросит у вас подтверждение:
Это, конечно, не прямой ответ на вопрос, но может спасти некоторые жизни ... Это спасло мою.
источник
Docker version 17.09.0-ce, build afdb6d4
docker
до той же версии, и она работает, спасибо.docker builder prune
для очистки кэшированных слоев сборки. Просто попал в ловушку после слепого копирования команд из переполнения стека.Команда
docker build --no-cache .
решила нашу похожую проблему.Наш Dockerfile был:
Но должно было быть:
Для предотвращения кеширования обновления и установки отдельно.
Смотрите: Лучшие практики для написания Dockerfiles
источник
RUN apt-get update && apt-get -y install php5-fpm
вы все равно увидите, что он снова используется со старым содержимым.Чтобы убедиться, что ваша сборка полностью перестроена, включая проверку базового образа на наличие обновлений, используйте при сборке следующие параметры:
--no-cache
- Это приведет к восстановлению уже доступных слоев--pull
- Это вызовет извлечение базового изображения, на которое ссылается FROM, и гарантирует получение последней версии.Поэтому полная команда будет выглядеть так:
Те же параметры доступны для docker-compose:
источник
Я бы не рекомендовал использовать
--no-cache
в вашем случае.Вы выполняете несколько установок с шага 3 по 9 (кстати, я бы предпочел использовать один вкладыш), и если вы не хотите, чтобы эти шаги накладывались повторно при каждом создании образа, вы можете измените ваш
Dockerfile
временный шаг до вашейwget
инструкции.Я использую, чтобы сделать что-то подобное
RUN ls .
и изменить его наRUN ls ./
затемRUN ls ./.
и так далее для каждой модификации, сделанной на tarball, полученнойwget
Конечно, вы можете сделать что-то вроде
RUN echo 'test1' > test && rm test
увеличения числа'test1
для каждой итерации.Это выглядит грязно, но, насколько я знаю, это самый эффективный способ продолжать получать выгоду от системы кеширования Docker, которая экономит время, когда у вас много слоев ...
источник
С docker-compose попробуй
docker-compose up -d --build --force-recreate
источник
Большая часть информации здесь верна.
Вот подборка их и мой способ их использования.
Идея состоит в том, чтобы придерживаться рекомендованного подхода (создавать специфичные и не влияющие на другие хранимые объекты докеров) и пробовать более радикальный подход (не создавать специфичные и не влияющие на другие хранимые объекты докеров), когда этого недостаточно.
Рекомендуемый подход:
1) Принудительное выполнение каждого шага / инструкции в Dockerfile:
или с
docker-compose build
:Мы также можем объединить это с
up
подкомандой, которая воссоздает все контейнеры:Этим способом используется не кеш, а построитель докеров и базовый образ, на который ссылается
FROM
инструкция.2) Протрите кэш Docker Builder (если мы используем Buildkit, нам, вероятно, это нужно):
3) Если мы не хотим использовать кэш родительских изображений, мы можем попытаться удалить их, например:
В большинстве случаев этих трех вещей вполне достаточно, чтобы обеспечить четкое построение нашего имиджа.
Поэтому мы должны попытаться придерживаться этого.
Более радикальный подход:
В тех случаях, когда кажется, что некоторые объекты в кэше докера все еще используются во время сборки, и это выглядит повторяющимся, мы должны попытаться понять причину, чтобы иметь возможность очень точно стереть недостающую часть. Если мы действительно не найдем способ восстановить с нуля, есть другие способы, но важно помнить, что они обычно удаляют гораздо больше, чем требуется. Поэтому мы должны использовать их с осторожностью, когда не находимся в локальной среде / среде разработки.
1) Удалите все изображения, не связав с ними хотя бы один контейнер:
2) Удалить еще много вещей:
Это говорит:
Использование этой команды супер удаления может быть недостаточно, поскольку она сильно зависит от состояния контейнеров (запущен или нет). Когда этой команды недостаточно, я стараюсь тщательно продумать, какие контейнеры Docker могут вызвать побочные эффекты в нашей сборке Docker, и разрешить выход этих контейнеров, чтобы их можно было удалить с помощью команды.
источник
Вы можете управлять кешем с помощью
docker builder
Чтобы очистить весь кэш без запроса:
docker builder prune -af
источник