2017-02-17 23 views
0

В Dockerfile У меня есть ЕК, который загружает основной образ, что-то вродеВыполняет ли команда запуска docker дважды?

FROM mysql:5.7 

Внутри Dockerfile для MySQL он выполняет команды, как APT-получить обновление, но то, что я не понимаю, почему Мне нужно запустить apt-get update после инструкции FROM в моем собственном файле Docker? Я знаю, что мне нужно запустить apt-get update, потому что последующие команды терпят неудачу, пока я не запустил apt-get, но я думал, что образ FROM уже выполнит эти команды?

ответ

0

Глядя на Dockerfile for mysql, вы увидите картину, как следующее на несколько команд: RUN

RUN apt-get update \ 
&& apt-get install -y --no-install-recommends \ 
     ca-certificates \ 
     wget \ 
&& rm -rf /var/lib/apt/lists/* 

Первая строка собирает текущее состояние пакета РЕПО, затем установить, запустить, и наконец, состояние repo пакета удаляется из файловой системы. Это после best practices from Docker предотвратить два вопроса:

  1. Очистка до ненужных файлов в одной и той же команды запуска, чтобы предотвратить раздувание в слои изображения.
  2. Удаление данных кэша, которое в конечном итоге станет устаревшим и приведет к ошибкам, если оно будет повторно использовано после его устаревания.

Общая ошибка пытается отделить apt-get update от apt-get install с двумя отдельными командами RUN. Из-за того, как docker кэширует слои, если команда apt-get update идентична командной команде давно, докер будет повторно использовать кэшированные результаты. Если вы затем измените команду apt-get install, чтобы включить различные пакеты, вы обнаружите, что изображение не будет создано, поскольку команда кэшированного обновления указывает на изображения, которые больше не находятся в репозиториях пакетов.