2016-10-03 7 views
1

A. Вот как я создал образ:Как нажимать только то, что изменилось с помощью нажатия Docker?

  1. Got последний Ubuntu образ
  2. Ран в качестве контейнера и прикрепленный к нему
  3. Клонирование исходный код из мерзавца внутри Docker контейнера
  4. меткой и толкнул Docker изображение в моем реестре

B. А с другой машины, я вытащил, изменился и толкнул его, выполнив:

  1. Docker вытащить из реестра
  2. Start контейнера с выдвинутым изображением и приложить к нему
  3. Изменить что-то в клонированной каталоге мерзавца
  4. Стоп контейнер, тег и вставьте его в реестр

Теперь вопрос я вижу в том, что каждый раз, когда B повторяется, он будет пытаться загрузить ~ 60 0MB (который является уровнем общего изображения) в реестр, который занимает много времени в моем случае.

Есть ли способ избежать загрузки всего 600 МБ и вместо этого нажать только один каталог, который изменился?

Что я делаю неправильно? Как вы, ребята, используете докер для частых нажатий?

+0

Возможный дубликат [Повторное построение изображения докеров с дополнительными изменениями в файле Dockerfile) (http://stackoverflow.com/questions/38613216/rebuild-same-docker-image-with-only-the-additional-changes -in-the-dockerfile) – Evedel

ответ

4

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

Пример - запустите контейнер из изображения ubuntu и запустите apt-get update, а затем передайте контейнер новому изображению. Теперь запустите docker history, и вы увидите новые изображения добавляет слой поверх Баш образа, который имеет дополнительное состояние от запуска APT обновления:

> docker history sixeyed/temp1 

IMAGE    CREATED    CREATED BY SIZE    COMMENT 
2d98a4114b7c  About a minute ago /bin/bash          22.2 MB 
14b59d36bae0  7 months ago   /bin/sh -C#(nop) CMD ["/bin/bash"]    0 B 
<missing>   7 months ago   /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB 
<missing>   7 months ago   /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB 
<missing>   7 months ago   /bin/sh -C#(nop) ADD file:620b1d9842ebe18eaa 187.8 MB 

В этом случае, в диф между ubuntu и моей temp1 Изображение представляет собой слой 22 МБ 2d98.

Теперь, если я запускаю новый контейнер из temp1, создайте пустой файл и запустить docker commit, чтобы создать новый образ, новый слой только имеет измененный файл:

> docker history sixeyed/temp2 
IMAGE    CREATED    CREATED BY SIZE    COMMENT 
e9ea4b4963e4  45 seconds ago  /bin/bash          0 B 
2d98a4114b7c  About a minute ago /bin/bash          22.2 MB 
14b59d36bae0  7 months ago   /bin/sh -C#(nop) CMD ["/bin/bash"]    0 B 
<missing>   7 months ago   /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB 
<missing>   7 months ago   /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB 
<missing>   7 months ago   /bin/sh -C#(nop) ADD file:620b1d9842ebe18eaa 187.8 MB 

Когда я push первое изображение, только уровень 22 МБ будет загружен - остальные будут установлены с ubuntu, который уже находится в концентраторе. Если я нажимаю второе изображение, только измененный слой получает толкнул - temp1 слой монтируется из первого толчка:

> docker push sixeyed/temp2 
The push refers to a repository [docker.io/sixeyed/temp2] 
f741d3d3ee9e: Pushed 
64f89772a568: Mounted from sixeyed/temp1 
5f70bf18a086: Mounted from library/ubuntu 
6f32b23ac95d: Mounted from library/ubuntu 
14d918629d81: Mounted from library/ubuntu 
fd0e26195ab2: Mounted from library/ubuntu       

Так что, если ваши толчки загрузки 600 Мб, вы либо вносить изменения 600MB к изображению, или ваш рабочий процесс не позволяет Docker правильно использовать слои.

+0

Спасибо. В B.3. step I меняет только один файл, но может быть, что в моем случае я помечен и нажат, тогда как в вашем случае вы только нажали на одно и то же изображение в хабе? – Griffin

+0

Нет, я использую два изображения, второе - измененная версия первой. Я бы запустил «историю докеров» на ваших A, B и изменил B-изображения, чтобы увидеть, какие слои используются повторно. –

0

Докер уже загружает только измененный слой.

Это похоже на то, как Docker build восстанавливает только недействительные уровни кэша. Конечно, он должен связываться с реестром, какие слои доступны (он сообщает как Already pushed). И если вы изменили последовательность своих операций в файле Docker, это абсолютно новые слои, и все они будут повторно загружены, очевидно.

FROM ubuntu 

RUN echo "hello" 

EXPOSE 80 

и

FROM ubuntu 

EXPOSE 80 

RUN echo "hello" 

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

+0

Я не включил ни один файл Docker в сценарий, который я дал, это проблема? – Griffin

+0

Все, что я хотел сказать, заключается в том, что изменение последовательности инструкций из одной версии файла Dockerfile на другую является возможной причиной, поэтому будьте осторожны с такими изменениями. В противном случае 'docker push' достаточно интеллектуальный, чтобы только продвигать новые слои. – activatedgeek

+1

Ну, в моем случае не существует Dockerfile, поэтому последовательность будет различной. Сценарий, как он описывается в вопросе, - не более того. – Griffin