Dockerfile — это текстовый файл, используемый для создания образа контейнера Docker. Он содержит ряд инструкций и конфигураций, описывающих, как собрать среду контейнера Docker. С помощью Dockerfile вы можете автоматически создавать образы, чтобы гарантировать возможность воспроизведения одного и того же контейнера в разных средах. Инструкции в Dockerfile могут указывать, из какого базового образа начинать сборку, копировать файлы в образ, устанавливать пакеты программного обеспечения, устанавливать переменные среды, предоставлять порты, запускать команды и многое другое. Каждая инструкция создает новый слой изображения в процессе построения изображения, и эти слои формируют структуру конечного изображения. Эта многоуровневая структура делает создание изображений более эффективным, а также облегчает повторное использование и обмен изображениями. Вот простой пример Dockerfile:
# Используйте официальный Python 3 Базазеркало
FROM python:3
# Переместите файл скопировать в текущий каталог на зеркало. /app Оглавление
COPY . /app
# Наладка работы
WORKDIR /app
# Установить пакеты зависимостей
RUN pip install -r requirements.txt
# Откройте порт, который прослушивает контейнер
EXPOSE 80
# Определите команду, которая будет запускаться при запуске контейнера
CMD ["python", "app.py"]
Приведенный выше файл Dockerfile создает образ на основе Python 3, копирует файлы из текущего каталога в каталог /app образа, устанавливает пакеты зависимостей, указанные в файле require.txt, предоставляет порт 80 контейнера и определяет запуск контейнера. время Команда для запуска. Использование Dockerfile может значительно упростить процесс создания образа и помочь разработчикам, а также группам эксплуатации и обслуживания более удобно управлять и доставлять среды приложений. С помощью Dockerfile вы можете определить полную рабочую среду приложения, не беспокоясь о несоответствии среды на разных машинах или платформах.
Полный список инструкций для файла dockerfile
Инструкции для Dockerfile | иллюстрировать |
---|---|
FROM | Укажите базовый образ для последующих сборок инструкций. |
MAINTAINER | Укажите автора/сопровождающего Dockerfile. |
LABEL | Добавьте метаданные изображения в виде пар ключ-значение. |
RUN | Выполняйте команды в образе во время процесса сборки. |
CMD | Указывает команду по умолчанию при создании контейнера. (можно переопределить) |
ENTRYPOINT | Устанавливает основную команду при создании контейнера. (невозможно переопределить) |
EXPOSE | Объявите конкретный сетевой порт, который прослушивает среда выполнения контейнера. |
ENV | Установите переменные среды внутри контейнера. |
ADD | Скопируйте файлы, каталоги или удаленные URL-адреса в изображение. |
COPY | Скопируйте файл или каталог в изображение. |
VOLUME | Создавайте точки монтирования или требуйте тома для контейнеров. |
WORKDIR | Установите рабочий каталог для последующих инструкций. |
USER | Указывает пользовательский контекст для последующих инструкций. |
ARG | Определяет переменные, передаваемые сборщику во время процесса сборки, которые можно установить с помощью команды «docker build». |
ONBUILD | Добавьте триггер, когда образ используется в качестве основы для другого процесса сборки. |
STOPSIGNAL | Устанавливает сигнал системного вызова, отправляемый в контейнер для выхода. |
HEALTHCHECK | Определите команды для периодической проверки состояния работоспособности контейнеров. |
SHELL | Переопределить оболочку по умолчанию в Docker для инструкций RUN, CMD и ENTRYPOINT. |
FROM — это первая инструкция в Dockerfile, которая также является обязательной. Он используется для указания базового образа, на основе которого создаются новые изображения. Базовый образ может быть официальным образом Docker или образом, опубликованным другими людьми или организациями в Docker Hub или других реестрах контейнеров.
Формат:
FROM <image>
FROM <image>:<tag>
Пример:
FROM nginx:1.25.1-alpine По умолчанию последняя версия Базазеркало не пишется.
Используется для указания информации о сопровождающем образе. Ее функция и использование аналогичны инструкции LABEL, которая используется для добавления к изображению метаданных, таких как автор, сопровождающий, контактная информация и т. д.
Формат:
MAINTAINER <name>
Пример:
MAINTAINER Jack yu
MAINTAINER xxx@qq.com
Используется для добавления тегов метаданных к изображениям. Эти теги могут содержать информацию об изображении, такую как автор, версия, описание, сопровождающий и т. д. Директива LABEL необязательна, но она добавляет к изображению полезную описательную информацию при его создании, помогая лучше управлять библиотекой изображений и организовывать ее.
Формат:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
Пример:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
Директива LABEL имеет более широкий спектр применения и может использоваться для добавления большего количества типов метаданных, тогда как директива MAINTAINER ограничивается указанием информации о сопровождающем. Поэтому, если вы пишете новый файл Dockerfile, рекомендуется использовать директиву LABEL для добавления метаданных и избегать использования устаревшей директивы MAINTAINER.
RUN — важная инструкция в Dockerfile, которая используется для выполнения команд в образе для установки пакетов программного обеспечения, настройки среды, генерации файлов и т. д. в процессе сборки. Команда, выполняемая инструкцией RUN, будет выполняться на новом слое образа, а в последующих сборках она будет выполняться повторно только при изменении предыдущего содержимого слоя. Для повышения скорости сборки используется механизм кэширования Docker. Команда RUN может принимать несколько форматов выполнения команды: Формат оболочки: по умолчанию команда RUN использует Shell для выполнения команд.
RUN apt-get update && apt-get install -y python3
Формат Exec: использование формата массива позволяет избежать неожиданных проблем интерпретации в оболочке.
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "python3"]
RUNинструкция может появляться несколько раз в Dockerfile.,И каждая RUNинструкция создает новый слой зеркала. Чтобы уменьшить количество слоев зеркала,Несколько команд можно объединить в одну строку,Например, используя&&Объединение нескольких команд,Таким образом, при построении зеркала будет создан только новый слой.
CMD — важная инструкция в Dockerfile, которая используется для определения команды, которая будет выполняться по умолчанию при запуске контейнера. Файл Dockerfile может содержать только одну инструкцию CMD. Если существует несколько инструкций CMD, вступит в силу только последняя инструкция CMD. Команда CMD имеет два формата: Формат оболочки: при использовании формата оболочки команда будет выполнена в командной консоли.
CMD python app.py
Формат Exec: при использовании формата массива команда будет выполняться не в оболочке, а непосредственно в контейнере.
CMD ["python", "app.py"]
Вы можете использовать команду CMD, чтобы определить команду запуска по умолчанию для образа. Когда вы используете команду docker run для запуска контейнера, если не указана другая команда, будет выполнена команда, определенная в CMD. Это устраняет необходимость вручную указывать команды для запуска при создании контейнера, что упрощает его использование. Если в команде запуска Docker указаны другие команды, команда по умолчанию в команде CMD будет переопределена. Например, если вы выполните следующую команду при запуске контейнера, она переопределит команду запуска по умолчанию, определенную в CMD:
docker run my_image python script.py
В приведенном выше примере контейнер запустит команду python script.py вместо команды, определенной в команде CMD по умолчанию.
ENTRYPOINT — важная инструкция в Dockerfile, которая используется для настройки команды выполнения по умолчанию при запуске контейнера. Она похожа на инструкцию CMD, но имеет некоторые ключевые отличия. Формат инструкции ENTRYPOINT аналогичен формату инструкции CMD или можно использовать формат массива, но при его использовании необходимо обратить внимание на следующие моменты:
Вот простой пример использования директивы ENTRYPOINT:
FROM ubuntu:latest
ENTRYPOINT ["echo", "Hello"]
Если мы создадим этот образ и запустим контейнер без указания других параметров, после запуска контейнер выведет «Hello»:
$ docker build -t my_image .
$ docker run my_image
Hello
Если мы предоставим дополнительные параметры при запуске контейнера, то эти параметры будут использоваться как параметры команды в директиве ENTRYPOINT:
$ docker run my_image "World"
Hello World
В реальных приложениях вы можете использовать инструкцию ENTRYPOINT для определения исполняемой программы или сценария, затем запускать программу при запуске контейнера и использовать контейнер Docker в качестве исполняемого приложения. Это гарантирует, что поведение контейнера во время выполнения будет предсказуемым, а логика конфигурации и выполнения контейнера может быть полностью инкапсулирована внутри образа, что делает использование контейнера более удобным и простым в управлении.
EXPOSE используется для объявления сетевого порта, который контейнер прослушивает во время выполнения. На самом деле он не открывает и не сопоставляет порт, а служит функцией документации, информирующей пользователей о том, что служба или приложение в образе будет использовать указанный порт. Вот простой пример:
FROM ubuntu:latest
# Контейнер операторов будет прослушивать порт 80
EXPOSE 80
В приведенном выше примере мы объявили, что контейнер будет прослушивать порт 80. Однако следует отметить, что EXPOSE фактически не открывает порт и не выполняет сопоставление портов. При использовании команды docker run для запуска контейнера, если вам нужно получить доступ к порту 80 контейнера через хост, вам также необходимо использовать опцию -p для сопоставления портов, например:
$ docker run -p 8080:80 my_image
Приведенная выше команда сопоставляет порт 80 контейнера с портом 8080 хоста, чтобы вы могли получить доступ к службам контейнера, обратившись к порту 8080 хоста.
ENV используется для установки переменных среды. Это позволяет устанавливать переменные среды во время процесса сборки образа, которые будут доступны при запуске контейнера. Формат инструкции ENV: ключ ENV=значение, где ключ — это имя переменной среды, а значение — значение переменной среды. Вы можете использовать несколько директив ENV для установки нескольких переменных среды.
FROM ubuntu:latest
# Установить переменные среды
ENV MY_NAME John Doe
ENV APP_HOME /app
# создавать Оглавлениеи Наладка работы
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
# скопировать приложение на зеркало
COPY . .
# Печать переменных среды во время выполнения
CMD echo "Hello, $MY_NAME"
В приведенном выше примере мы использовали две инструкции ENV для установки двух переменных среды: MY_NAME и APP_HOME. В процессе создания образа этим переменным среды будут присвоены указанные значения. Затем, когда контейнер запустится, команда в директиве CMD выведет приветствие, используя значение переменной среды $MY_NAME. При запуске контейнера вы можете переопределить значение переменной среды с помощью опции -e команды запуска Docker. Например:
$ docker run -e MY_NAME="Alice" my_image
Приведенная выше команда перезапишет значение переменной среды MY_NAME по умолчанию, и контейнер выведет «Привет, Алиса».
ADDиспользуется для Скопируйте файлы, каталоги или удаленные URL-адреса в изображение Похожа на COPYинструкцию, но более мощная по функциональности. Формат ADDИнструкции: ADD. source место назначения, где источник — это исходный файл, каталог или URL-адрес для копирования, а место назначения — это путь назначения после копирования. пунктом назначения может быть абсолютный путь или путь относительно рабочего каталога. Помимо копирования файлов и каталогов, команда ADD также поддерживает автоматическую распаковку. Если источником является сжатый файл (например, .tar, .tar.gz, .tgz, .zip и т. д.), то команда ADD автоматически распакует файл в каталог, указанный местом назначения. Вот несколько примеров инструкций ADD: копирование локальных файлов в образ:
ADD app.py /app/
Скопируйте локальный каталог в образ:
ADD src/ /app/
Загрузите файл с удаленного URL-адреса и скопируйте его на зеркало:
ADD https://example.com/file.tar.gz /tmp/
Разархивируйте zip-файл и скопируйте его в образ:
ADD app.tar.gz /app/
COPY используется для копирования локальных файлов или каталогов в изображение. Он не поддерживает функцию автоматической распаковки, и его функция проще и понятнее, чем инструкция ADD. Формат инструкции COPY — COPY исходный пункт назначения, где источник — это исходный файл или каталог, который нужно скопировать, а пункт назначения — это путь назначения после копирования. пунктом назначения может быть абсолютный путь или путь относительно рабочего каталога. Вот несколько примеров инструкций COPY: копирование локальных файлов в изображение:
COPY app.py /app/
Скопируйте локальный каталог в образ:
COPY src/ /app/
Команда COPY скопирует локальные файлы или каталоги в указанное место образа. При создании образа Docker добавит скопированные файлы или каталоги на уровень файловой системы образа. Это делает процесс создания образа более явным и не приводит к неопределенному поведению автоматической распаковки. По сравнению с инструкцией ADD, инструкция COPY более рекомендуется, особенно когда вам нужно просто скопировать локальные файлы или каталоги. Инструкция COPY имеет простую функцию и вряд ли приведет к ненужному неожиданному поведению. Для большинства сценариев копирования файлов рекомендуется использовать директиву COPY.
VOLUME используется для объявления точки монтирования (тома данных) в контейнере. Том данных — это специальный каталог, который обходит файловую систему Union (UnionFS) и распределяет данные между контейнерами. Формат инструкции VOLUME — VOLUME ["/путь/к/каталогу"], где /путь/к/каталогу — это путь к точке монтирования. В файле Dockerfile можно использовать несколько директив VOLUME для объявления нескольких точек монтирования. Вот простой пример:
FROM ubuntu:latest
# Объявить две точки монтирования
VOLUME ["/app/data", "/app/logs"]
В приведенном выше примере мы объявили две точки монтирования /app/data и /app/logs, чтобы при запуске контейнера эти две точки монтирования можно было сопоставить с файловой системой хоста для обеспечения постоянного хранения и совместного использования данных. При запуске контейнера вы можете использовать параметр -v или --mount, чтобы сопоставить каталог хоста или том данных с точкой монтирования контейнера. Например:
$ docker run -v /host/data:/app/data -v /host/logs:/app/logs my_image
Приведенная выше команда сопоставляет каталоги /host/data и /host/logs хоста с точками монтирования /app/data и /app/logs в контейнере соответственно, реализуя совместное использование данных между хостом и контейнером.
WORKDIR используется для установки рабочего каталога, также известного как текущий рабочий каталог. При запуске контейнера текущий рабочий каталог процесса будет установлен в каталог, указанный директивой WORKDIR. Мы используем директиву WORKDIR, чтобы установить рабочий каталог /app,
FROM ubuntu:latest
# Наладка работы
WORKDIR /app
# контейнер Команда, запускаемая при запуске
CMD ["python", "app.py"]
При запуске контейнера текущий рабочий каталог процесса будет автоматически установлен в /app, так что при выполнении команды CMD нет необходимости использовать абсолютный путь для запуска python app.py.
USER используется для указания непривилегированного пользователя, который будет использоваться при запуске образа в контейнере. По умолчанию контейнеры Docker при запуске запускаются от имени пользователя root, а это означает, что процессы внутри контейнера имеют самые высокие разрешения. Однако для повышения безопасности и предотвращения потенциальных угроз безопасности лучше всего запускать приложения в контейнерах от имени непривилегированного пользователя. Вот простой пример:
FROM ubuntu:latest
# Создайте нового пользователя и переключитесь на этого пользователя
RUN useradd -ms /bin/bash myuser
USER myuser
# Наладка работы
WORKDIR /app
# скопировать ПРИЛОЖЕНИЕ ДЛЯ РАБОТЫ Оглавление
COPY . .
# Установить переменные среды
ENV APP_ENV production
# контейнер Команда, запускаемая при запуске
CMD ["python", "app.py"]
В приведенном выше примере мы использовали команду useradd для создания нового пользователя с именем myuser и использовали параметр -ms /bin/bash, чтобы указать оболочку, которая будет использоваться при создании пользователя. Затем переключитесь на пользователя myuser с помощью команды USER. Таким образом, когда контейнер запущен, процесс будет выполняться от имени пользователя myuser, а не от имени пользователя root.
ARG используется для определения параметров сборки (аргументов времени сборки). Аргументы сборки позволяют передавать значения переменных при построении образа. Эти переменные можно использовать в Dockerfile и переопределить в процессе сборки с помощью опции --build-arg. Вот простой пример:
FROM ubuntu:latest
# Определить параметры сборки
ARG MY_ENV=production
# Использование параметров сборки Установить переменные среды
ENV ENVIRONMENT=$MY_ENV
В приведенном выше примере мы определили параметр сборки с именем MY_ENV через директиву ARG и установили для него значение по умолчанию — производство. Затем, после директивы FROM, мы устанавливаем переменную среды под названием ENVIRONMENT, используя параметры сборки. При сборке образа вы можете указать значение параметра сборки через опцию --build-arg, например:
$ docker build --build-arg MY_ENV=development -t my_image .
В приведенной выше команде мы используем опцию --build-arg, чтобы перезаписать значение параметра сборки MY_ENV для разработки. Использование параметров сборки позволяет параметризовать конфигурацию по мере необходимости при создании образа, что делает образ более гибким и настраиваемым.
ONBUILD используется для определения триггера для выполнения ряда операций, когда текущее изображение создается в качестве базового изображения другими изображениями. Другими словами, ONBUILD позволяет вам определять некоторые операции при построении текущего образа, и эти операции будут выполняться при построении других изображений на основе текущего образа. Например, вы можете использовать директиву ONBUILD в базовом образе, чтобы определить операцию установки пакетов зависимостей, а затем другие образы смогут наследовать этот базовый образ и автоматически устанавливать необходимые зависимости при сборке. Базовый образ/Dockerfile:
FROM ubuntu:latest
# Установите несколько базовых пакетов зависимостей.
RUN apt-get update && apt-get install -y build-essential
# Действия, выполняемые при сборке другого зеркала
ONBUILD RUN echo "Hello from the ONBUILD trigger!"
Другие изображения myapp/Dockerfile:
FROM base
# скопировать приложение на зеркало
COPY . /app
# контейнер Команда, запускаемая при запуске
CMD ["python", "app.py"]
В приведенном выше примере мы определили базу базового образа, которая содержит триггер ONBUILD и выводит «Привет от триггера ONBUILD!» при построении других изображений. Затем в другом образе myapp мы наследуем базовый образ и запускаем приложение в контейнере. При создании образа myapp автоматически запускается триггер ONBUILD и выводится сообщение.
STOPSIGNAL используется для установки сигнала, который будет использоваться при остановке контейнера. Когда вы используете команду docker stop для остановки контейнера, Docker отправит контейнеру указанный сигнал, который инициирует операцию остановки контейнера.
FROM ubuntu:latest
# Установите сигнал, используемый при остановке контейнера
STOPSIGNAL SIGINT
В приведенном выше примере мы используем инструкцию STOPSIGNAL, чтобы установить сигнал, используемый при остановке контейнера, в SIGINT, то есть номер сигнала равен 2. Это означает, что когда мы используем команду docker stop для остановки контейнера, Docker отправит контейнеру сигнал SIGINT, чтобы запустить операцию остановки контейнера.
HEALTHCHECK используется для определения механизма проверки работоспособности контейнера. Проверка работоспособности — это механизм, используемый для определения того, находится ли контейнер в нормальном рабочем состоянии. Регулярно проверяя службы или приложения внутри контейнера, вы можете гарантировать, что контейнер продолжает предоставлять доступные службы. Инструкция HEALTHCHECK имеет следующие параметры:
Вот простой пример:
FROM ubuntu:latest
# команда проверки работоспособности
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1
В приведенном выше примере мы определяем механизм проверки работоспособности с помощью директивы HEALTHCHECK. Он будет запускать команду Curl каждые 5 секунд, чтобы проверить, возвращает ли http://localhost/ нормальный ответ (код состояния — 200). Если проверка не удалась (код состояния возврата не равен 200), контейнер будет помечен как неработоспособный. Проверка работоспособности выполняется внутри контейнера, а состояние работоспособности контейнера определяется путем выполнения команды проверки в контейнере. Когда состояние работоспособности контейнера изменится, Docker соответствующим образом обновит состояние работоспособности контейнера, а при использовании Docker API вы можете понять состояние работоспособности контейнера, запросив состояние работоспособности контейнера. Использование инструкции HEALTHCHECK может повысить надежность и устойчивость контейнера, особенно при использовании инструментов оркестрации, таких как Docker Compose или Kubernetes, которые могут выполнять автоматическую настройку работоспособности и операции замены контейнера в зависимости от состояния работоспособности контейнера.
SHELL — это специальная инструкция в Dockerfile, используемая для установки оболочки, используемой при создании образа. Он позволяет указать интерпретатор оболочки, используемый командами, выполняемыми в Dockerfile.
# Настройте bash в качестве интерпретатора оболочки
SHELL ["/bin/bash", "-c"]
# Выполнить команду при построении зеркала
RUN echo "Hello, Docker!"
В приведенном выше примере мы использовали директиву SHELL, чтобы установить интерпретатор оболочки bash. Затем в инструкции RUN мы выполнили простую команду для вывода «Hello, Docker!».
Вот простой пример Dockerfile:
# Используйте официальныйUbuntu 20.04зеркало AS Базазеркало
FROM ubuntu:20.04
# Наладка работы
WORKDIR /app
# скопировать приложение на зеркало
COPY . .
# Установите зависимости, необходимые приложению
RUN apt-get update && apt-get install -y python3
# Установить переменные среды
ENV APP_ENV production
# контейнер Команда, запускаемая при запуске
CMD ["python3", "app.py"]
Образ сборки: команда сборки docker:
docker build -t my_image .
Команда docker build выполнит инструкции в Dockerfile одну за другой и создаст новый образ. В процессе сборки будет создан новый слой изображения на основе содержимого каждой инструкции. Каждая инструкция будет изменена на основе предыдущего слоя, и, наконец, будет построен полный образ. Постройте изображение по параметрам:
# Используйте официальныйUbuntu 20.04зеркало AS Базазеркало
FROM ubuntu:20.04
# Определить параметры сборки
ARG APP_VERSION=1.0
# Наладка работы
WORKDIR /app
# скопировать приложение на зеркало
COPY app-v$APP_VERSION .
# контейнер Команда, запускаемая при запуске
CMD ["./app"]
При построении образа вы можете указать значение параметра сборки с помощью опции --build-arg:
docker build --build-arg APP_VERSION=2.0 -t my_app .
Приведенная выше команда создаст образ с меткой my_app, в котором значение параметра сборки APP_VERSION равно 2.0, поэтому инструкция COPY скопирует каталог app-v2.0 в образ.
Минимизация размера зеркала Docker — важная стратегия оптимизации.,Может снизить накладные расходы на передачу и хранение данных в сети.,Ускорьте загрузку и развертывание зеркала. Вот несколько советов по минимизации размера изображения:
Многоэтапное строительство – эффективный метод оптимизации,Можно использовать несколько инструкций FROM в одном Dockerfile.,Каждая инструкция FROM представляет собой этап сборки. На каждом этапе сборки можно получить необходимые файлы с предыдущего этапа. Копировать,и выполнять определенные операции сборки. Использование многоэтапных сборок позволяет сделать так, чтобы окончательно сгенерированное зеркало содержало только файлы и зависимости, необходимые для запуска приложения.,без включения ненужных файлов и зависимостей, сгенерированных в процессе сборки。Ниже представлена многоэтапная сборка.Пример:
# Фаза сборки 1
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
# Скомпилируйте приложение
RUN go build -o myapp
# Фаза сборки 2
FROM alpine:latest
# копировать скомпилированное приложение
COPY --from=builder /app/myapp /usr/local/bin/
# Наладка работы
WORKDIR /usr/local/bin
# контейнер Команда, запускаемая при запуске
CMD ["myapp"]
В приведенном выше примере мы используем две фазы сборки. На первом этапе сборки используется базовый образ Golang для компиляции приложения, а на втором этапе сборки используется базовый образ Alpine Linux для копирования только скомпилированного приложения и установки команды при запуске контейнера.
Docker кэширует результаты каждой инструкции при построении образа, чтобы кеш можно было использовать напрямую при следующей сборке той же инструкции для ускорения сборки. При написании файла Dockerfile порядок инструкций можно организовать в соответствии с характеристиками инструкций, так что часто меняющиеся инструкции располагаются сзади, а неизмененные — спереди. Это позволяет максимально эффективно использовать кэширование Docker. механизм. Например, установите редко изменяемые базовые зависимости в первую директиву и поместите часто изменяемый код приложения в последующие директивы.
Многоуровневая сборка зеркала означает использование нескольких инструкций RUN для сборки зеркала в одном Dockerfile. Каждая RUNинструкция генерирует новый слой зеркала.,И каждый слой зеркала занимает дополнительное место для хранения. Оптимизировать сборку многослойного зеркала,Можно использовать&&Оператор объединяет несколько команд в однуRUNинструкция,Избегайте создания дополнительных слоев зеркала. в то же время,Выполнение нескольких команд в одной RUNинструкции может уменьшить размер Dockerзеркало. Например,Объедините несколько команд установки apt-get в одну команду RUN:
RUN apt-get update && apt-get install -y \
package1 \
package2 \
package3
Это позволяет объединить несколько команд установки в один слой образа и уменьшить его размер.