- PVSM.RU - https://www.pvsm.ru -
Когда вы указываете в Dockerfile:
FROM ubuntu
то к вам на машину стягивается официально-поддерживаемый базовый образ Ubuntu [1] (на сегодняшний день это 14.04 LTS). Мне стало интересно, чем образ этот отличается от «настоящей» чистой системы.
В процессе pull можно заметить, что он состоит из 5 слоёв:
docker pull ubuntu ubuntu:latest: The image you are pulling has been verified 511136ea3c5a: Pull complete 3b363fd9d7da: Downloading 8.641 MB/197.2 MB 3m18s 607c5d1cca71: Download complete f62feddc05dc: Download complete 8eaa4ff06b53: Download complete
Чтобы понять содержание каждого слоя, можно выполнить команду:
docker history --no-trunc ubuntu > history.txt
либо посмотреть исходный Dockerfile [2] на GitHub. Каждый слой соответствует отдельной строке в Dockerfile:
511136ea3c5a — это отправная точка, пустой образ под названием scratch [3] (строка FROM scratch [4]).
3b363fd9d7da — «вливание» [5] официального образа Ubuntu из файла ubuntu-trusty-core-cloudimg-amd64-root.tar.gz [6]
Далее начинается интересное.
607c5d1cca71 — длинная цепочка команд [7] (команды рекомендуется объединять таким образом, чтобы не создавать большого количества слоёв, т.к. это чревато проблемами [8]).
Остановимся здесь на минутку. Сначала добавляется скрипт policy-rc.d [9], который запрещает автоматический старт служб в процессе установки. Подробности можно прочитать в этой статье [10].
Именно поэтому вы наблюдаете в процессе билда:
invoke-rc.d: policy-rc.d denied execution of stop. invoke-rc.d: policy-rc.d denied execution of start.
Следующая группа строк [11] замещает файл /sbin/initctl. Цель этого изменения — заглушить предупреждение при попытке выполнить команду service:
Failed to connect to socket /com/ubuntu/upstart: Connection refused
В контейнерах upstart, естественно, не запущен (а в случае необходимости запуска нескольких служб рекомендуют Supervisor [12]).
Делается это, на мой взгяд, кривовато: было бы проще заменить initctl ссылкой на /bin/true, но смысл не меняется. dpkg-divert указвыает, что initctl не надо перезаписывать при последующих установках обновлениий.
Далее следует конфигурирование установщика пакетов: отключение fsync [13] для ускорения (в случае проблем всегда можно пересоздать контейнер с чистого листа), очистка кеша deb-файлов [14] (он только занимает лишнее место в слоистой файловой системе), отключение установки переводов [15] и активация сжатия индексов [16] (не уверен, зачем именно это нужно).
f62feddc05dc — по непонятным причинам (вероятно, только для того, чтобы вставить комментарий) ещё одна команда [17] вынесена из предыдущей цепочки. Данная строка активирует universe package source, правда не делает при этом apt-get update, так что перед установкой любого universe-пакета вам придется сделать update самим.
Наконец, последний слой выставляет /bin/bash [18] в качестве команды по умолчанию.
Я подумал, что каждому, кто пользуется стандартными образами, полезно было бы знать, с чем именно он имеет дело. Прошу прощения у тех, кому статья показалась банальной. На этом пока что всё.
Автор: amartynov
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/virtualizatsiya/79621
Ссылки в тексте:
[1] официально-поддерживаемый базовый образ Ubuntu: https://registry.hub.docker.com/_/ubuntu/
[2] исходный Dockerfile: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile
[3] scratch: https://registry.hub.docker.com/_/scratch/
[4] FROM scratch: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L1
[5] «вливание»: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L2
[6] ubuntu-trusty-core-cloudimg-amd64-root.tar.gz: https://partner-images.canonical.com/core/trusty/20141203.1/ubuntu-trusty-core-cloudimg-amd64-root.tar.gz
[7] длинная цепочка команд: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L6-L22
[8] проблемами: https://github.com/docker/docker/issues/1171
[9] добавляется скрипт policy-rc.d: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L6-L8
[10] этой статье: http://jpetazzo.github.io/2013/10/06/policy-rc-d-do-not-start-services-automatically/
[11] группа строк: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L10-L12
[12] рекомендуют Supervisor: https://docs.docker.com/articles/using_supervisord/
[13] отключение fsync: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L14
[14] очистка кеша deb-файлов: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L16-L18
[15] отключение установки переводов: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L20
[16] активация сжатия индексов: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L22
[17] ещё одна команда: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L24-L25
[18] выставляет /bin/bash: https://github.com/tianon/docker-brew-ubuntu-core/blob/09e0fe385154ae9d23b231e2bfaa172258a9530b/trusty/Dockerfile#L27-L28
[19] Источник: http://habrahabr.ru/post/247903/
Нажмите здесь для печати.