Поскольку все больше и больше приложений будут контейнерными, важно указать несколько лучших практик для оптимизации и лучшего поддержки здания этих изображений.
Оптимизировать контекст сборки
Один аргумент, который передается на Docker Build
Команда — это контекстное местоположение. Это место представляет каталог, который будет иметь доступ для всех инструкций, которые он собирается обрабатывать. Любой Скопировать
или Добавить
Инструкция использует это местоположение в качестве базового каталога. Создание также использует это место для определения того, что файл изменился, и, таким образом, должен сломать кеш слоя. Именно по этой причине следует принять тщательное рассмотрение к файлу .Dockerignore, чтобы убедиться, что каталоги или файлы, которые не требуются, не включены в контекст. Примеры исключают такие вещи, как отчеты, документация, каталог Node_Module, и, как правило, каталог .git. Общим примером является Копировать. Отказ
Команда поместила файлы .git на изображение.
Использовать этикетки
Этикетки полезны для хранения метаданных о изображении, таком как GIT Commit Hash или сопровождающий. Если ваша организация создает много изображений, это хорошая практика для хранения таких метаданных в общей форме, так что информация может быть получена в целом. Вот пример того, как добавить HIT Commit Hash к изображению как метку, а затем извлечь его.
Содержание докерафила:
ARG GIT_COMMIT=unspecified LABEL git_commit=$GIT_COMMIT
Создать команду:
docker build --build-arg GIT_COMMIT=$(git log -1 --format=%h) -t my-image .
Получить значение:
docker inspect –f {{index .Config.Labels.git_commit}} my-image
Порты документов
Выставлять
Директива в DockerFile на самом деле не подвергает порта к хосту во время выполнения. Единственное, что он может автоматически делать во время выполнения, связывает этот порт для случайного порта на хост-машине, если -П
Опция используется в команде запуска. Именно по этой причине это Выставлять
Директива наиболее часто используется и должна использоваться, чтобы документировать, что если вы запускаете изображение в качестве контейнера, то вам следует сопоставить порта хоста к указанному порту. Это полезно для времени, когда приложение настроило время выполнения сервера, чтобы использовать другой порт, чем по умолчанию.
Скопировать vs Добавить
Оба Скопировать
и Добавить
Директивы обеспечивают возможность передачи файлов на изображение. Тем не менее, Добавить
Имеет две дополнительные функции в том, что первый аргумент может быть URL и если первый аргумент является архивом, он автоматически будет извлечен. Именно по этой причине это полезно только использовать только Добавить
Директива Если вы делаете одну из этих двух вещей. В противном случае предпочтительно использовать Скопировать
Директива.
Оптимизируйте кэш слоя
Каждая Директива в докеренном файле приводит к появлению слоя, и каждый слой оценивается во время сборки, чтобы определить, следует использовать ли слой кэшированного слоя VS, выполняющий директиву. После того, как слой определен, чтобы не использовать кэш, выполняется все другие последующие директивы, и кэш не будет рассматриваться или использоваться. Именно по этой причине следует проводить тщательное рассмотрение на порядок того, какие директивы перечислены в DockerFile. Вещи, которые изменяют наименее, должны прийти перед вещами, которые чаще меняются.
Вот пример разницы между двумя докерафами и что произойдет, если бы изменение было сделано в какой-то код, написанный в узле:
FROM node WORKDIR /usr/src/app COPY . . <------- Cache is broken here RUN npm install EXPOSE 8080 CMD ["npm", "start"]
С тонким изменением кэш слоя будет нарушен только в том случае, если изменение сделано для Package.json. NPM установить
Команда будет работать только в этом случае, но кэшированный слой будет использоваться, если изменение было сделано в файл, отличный от pack.json.
FROM node WORKDIR /usr/src/app COPY package*.json . RUN npm install COPY . . <------- Cache is broken here EXPOSE 8080 CMD ["npm", "start"]
Резюме
Это всего лишь некоторые из лучших практик, которые могут быть приняты, чтобы сохранить время сборки, экономить время разработки, а также предоставлять документацию, чтобы избежать путаницы. Существует много способов, которыми можно построить изображение и предоставить ту же функциональность, поэтому осторожное рассмотрение должно быть сделано с этими деталями.
Оригинал: «https://dev.to/leading-edje/docker-build-best-practices-32fh»