Почему одна и та же команда RUN в Dockerfile приводит к разным размерам слоев по изображениям? - PullRequest
1 голос
/ 24 января 2020

Я использую один и тот же раздел в двух разных файлах Docker (база - Ubuntu: 18.04 в обоих случаях), которые загружают два файла из удаленного места с помощью wget.

ENV ROBOT v1.5.0
ENV ROBOT_JAR=https://github.com/ontodev/robot/releases/download/$ROBOT/robot.jar
RUN wget $ROBOT_JAR -O /tools/robot.jar && \
    wget https://raw.githubusercontent.com/ontodev/robot/$ROBOT/bin/robot -O /tools/robot && \
    chmod +x /tools/*

docker history --no-trunc [...]

говорит мне, что в одном Dockerfile слой, созданный этой командой, имеет размер 114 МБ:

... /bin/sh -c wget $ROBOT_JAR -O /tools/robot.jar &&     wget https://raw.githubusercontent.com/ontodev/robot/$ROBOT/bin/robot -O /tools/robot &&     chmod +x /tools/* 114MB   

, а в другом только 44,9 МБ:

... /bin/sh -c wget $ROBOT_JAR -O /tools/robot.jar &&     wget https://raw.githubusercontent.com/ontodev/robot/$ROBOT/bin/robot -O /tools/robot &&     chmod +x /tools/* 44.9MB              

Помимо того, что файлы Docker имеют одну и ту же базу, они, конечно, очень разные (например, один файл размером 114 МБ огромен, тогда как файл объемом 45 МБ имеет только два определенных слоя); Мне любопытно: что может вызвать разницу в размерах? Можно ли это как-то смягчить?

РЕДАКТИРОВАТЬ 1:

Вот случай 114 МБ: https://github.com/INCATools/ontology-development-kit/blob/master/Dockerfile

Вот другой: https://github.com/INCATools/ontology-development-kit/blob/master/docker/testdocker/Dockerfile

1 Ответ

2 голосов
/ 24 января 2020

Причина chmod +x. Каждый раз, когда вы изменяете файл, даже просто chmod или chown, на следующем слое сохраняется совершенно новая копия файла.

Вы можете использовать многоэтапные сборки для создания окончательного изображения который не имеет всех промежуточных слоев, например, если вы используете Python, вот руководство к нему: https://pythonspeed.com/articles/smaller-python-docker-images/

А вот обобщенные c Docker документы: https://docs.docker.com/develop/develop-images/multistage-build/

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