репозиторий - Как заставить Docker для чистой сборки изображения





hub image (5)


Я бы не рекомендовал использовать --no-cache в вашем случае.

Вы выполняете несколько установок с шага 3 до 9 (я бы, кстати, предпочел использовать один лайнер), и если вы не хотите накладных расходов на повторное выполнение этих шагов каждый раз при создании своего изображения, вы можете измените свой Dockerfile с временным шагом до вашей инструкции wget .

Я использую что-то вроде RUN ls . и измените его на RUN ls ./ затем RUN ls ./. и т. д. для каждой модификации, сделанной на tarball, полученном wget

Конечно, вы можете сделать что-то вроде RUN echo 'test1' > test && rm test увеличивая число в 'test1 для каждой итерации.

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

Я создал изображение Docker из файла Docker, используя следующую команду.

$ docker build -t u12_core -f u12_core .

Когда я пытаюсь перестроить его с помощью той же команды, он использует кеш сборки, например:

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <[email protected]>
 ---> 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 '[email protected]\s*required\s*[email protected] optional [email protected]' -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 восстанавливать чистое изображение без кеша?




Существует опция --no-cache :

docker build --no-cache -t u12_core -f u12_core .

В более старых версиях Docker вам нужно было передать --no-cache=true , но это уже не так.




В некоторых крайних случаях ваш единственный способ избежать повторяющихся сбоев сборки - это запустить:

docker system prune

Команда запросит у вас подтверждение:

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N]

Это, конечно, не прямой ответ на вопрос, но может спасти некоторые жизни ... Это спасло мое.




Команда docker build --no-cache . решили нашу аналогичную проблему.

Наш файл Dockerfile был:

RUN apt-get update
RUN apt-get -y install php5-fpm

Но должно было быть:

RUN apt-get update && apt-get -y install php5-fpm

Чтобы предотвратить кеширование обновления и установку отдельно.

См .: Рекомендации по написанию Dockerfiles




Чтобы отобразить только контейнеры SHA1:

docker ps -aq --no-trunc

Таким образом, вы можете использовать список всех контейнеров для других команд (которые принимают несколько идентификаторов контейнера в качестве параметров).

Например, чтобы отобразить только имя всех контейнеров (поскольку docker ps перечисляет только их имена с другой информацией):

docker inspect --format='{{.Name}}' $(sudo docker ps -aq --no-trunc)






docker