Эта статья длиной в 10 000 слов проведет вас через самое подробное руководство по Dockerfile в Интернете.
Эта статья длиной в 10 000 слов проведет вас через самое подробное руководство по Dockerfile в Интернете.
Что такое Dockerfile

Dockerfile — это текстовый файл, используемый для создания образа контейнера Docker. Он содержит ряд инструкций и конфигураций, описывающих, как собрать среду контейнера Docker. С помощью Dockerfile вы можете автоматически создавать образы, чтобы гарантировать возможность воспроизведения одного и того же контейнера в разных средах. Инструкции в Dockerfile могут указывать, из какого базового образа начинать сборку, копировать файлы в образ, устанавливать пакеты программного обеспечения, устанавливать переменные среды, предоставлять порты, запускать команды и многое другое. Каждая инструкция создает новый слой изображения в процессе построения изображения, и эти слои формируют структуру конечного изображения. Эта многоуровневая структура делает создание изображений более эффективным, а также облегчает повторное использование и обмен изображениями. Вот простой пример Dockerfile:

Язык кода:javascript
копировать
# Используйте официальный 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

Инструкции для 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

FROM — это первая инструкция в Dockerfile, которая также является обязательной. Он используется для указания базового образа, на основе которого создаются новые изображения. Базовый образ может быть официальным образом Docker или образом, опубликованным другими людьми или организациями в Docker Hub или других реестрах контейнеров.

Язык кода:javascript
копировать
Формат:
  FROM <image>
  FROM <image>:<tag>
Пример:
    FROM nginx:1.25.1-alpine По умолчанию последняя версия Базазеркало не пишется.

MAINTAINER

Используется для указания информации о сопровождающем образе. Ее функция и использование аналогичны инструкции LABEL, которая используется для добавления к изображению метаданных, таких как автор, сопровождающий, контактная информация и т. д.

Язык кода:javascript
копировать
Формат:
    MAINTAINER <name>
Пример:
    MAINTAINER Jack yu
    MAINTAINER xxx@qq.com

LABEL

Используется для добавления тегов метаданных к изображениям. Эти теги могут содержать информацию об изображении, такую ​​как автор, версия, описание, сопровождающий и т. д. Директива LABEL необязательна, но она добавляет к изображению полезную описательную информацию при его создании, помогая лучше управлять библиотекой изображений и организовывать ее.

Язык кода:javascript
копировать
Формат:
   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

RUN — важная инструкция в Dockerfile, которая используется для выполнения команд в образе для установки пакетов программного обеспечения, настройки среды, генерации файлов и т. д. в процессе сборки. Команда, выполняемая инструкцией RUN, будет выполняться на новом слое образа, а в последующих сборках она будет выполняться повторно только при изменении предыдущего содержимого слоя. Для повышения скорости сборки используется механизм кэширования Docker. Команда RUN может принимать несколько форматов выполнения команды: Формат оболочки: по умолчанию команда RUN использует Shell для выполнения команд.

Язык кода:javascript
копировать
RUN apt-get update && apt-get install -y python3

Формат Exec: использование формата массива позволяет избежать неожиданных проблем интерпретации в оболочке.

Язык кода:javascript
копировать
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "python3"]

RUNинструкция может появляться несколько раз в Dockerfile.,И каждая RUNинструкция создает новый слой зеркала. Чтобы уменьшить количество слоев зеркала,Несколько команд можно объединить в одну строку,Например, используя&&Объединение нескольких команд,Таким образом, при построении зеркала будет создан только новый слой.

CMD

CMD — важная инструкция в Dockerfile, которая используется для определения команды, которая будет выполняться по умолчанию при запуске контейнера. Файл Dockerfile может содержать только одну инструкцию CMD. Если существует несколько инструкций CMD, вступит в силу только последняя инструкция CMD. Команда CMD имеет два формата: Формат оболочки: при использовании формата оболочки команда будет выполнена в командной консоли.

Язык кода:javascript
копировать
CMD python app.py

Формат Exec: при использовании формата массива команда будет выполняться не в оболочке, а непосредственно в контейнере.

Язык кода:javascript
копировать
CMD ["python", "app.py"]

Вы можете использовать команду CMD, чтобы определить команду запуска по умолчанию для образа. Когда вы используете команду docker run для запуска контейнера, если не указана другая команда, будет выполнена команда, определенная в CMD. Это устраняет необходимость вручную указывать команды для запуска при создании контейнера, что упрощает его использование. Если в команде запуска Docker указаны другие команды, команда по умолчанию в команде CMD будет переопределена. Например, если вы выполните следующую команду при запуске контейнера, она переопределит команду запуска по умолчанию, определенную в CMD:

Язык кода:javascript
копировать
docker run my_image python script.py

В приведенном выше примере контейнер запустит команду python script.py вместо команды, определенной в команде CMD по умолчанию.

ENTRYPOINT

ENTRYPOINT — важная инструкция в Dockerfile, которая используется для настройки команды выполнения по умолчанию при запуске контейнера. Она похожа на инструкцию CMD, но имеет некоторые ключевые отличия. Формат инструкции ENTRYPOINT аналогичен формату инструкции CMD или можно использовать формат массива, но при его использовании необходимо обратить внимание на следующие моменты:

  1. Команда ENTRYPOINTинструкция всегда будет выполняться при запуске контейнера.,Независимо от того, указаны ли в команде запуска docker другие команды. оно не будет перезаписано,Скорее, он служит основной командой выполнения контейнера.
  2. Если в команде запуска docker указаны другие команды, они будут переданы как параметры директивы ENTRYPOINT. Другими словами, команда в директиве ENTRYPOINT станет префиксом при выполнении.

Вот простой пример использования директивы ENTRYPOINT:

Язык кода:javascript
копировать
FROM ubuntu:latest
 
ENTRYPOINT ["echo", "Hello"]

Если мы создадим этот образ и запустим контейнер без указания других параметров, после запуска контейнер выведет «Hello»:

Язык кода:javascript
копировать
$ docker build -t my_image .
$ docker run my_image
Hello

Если мы предоставим дополнительные параметры при запуске контейнера, то эти параметры будут использоваться как параметры команды в директиве ENTRYPOINT:

Язык кода:javascript
копировать
$ docker run my_image "World"
Hello World

В реальных приложениях вы можете использовать инструкцию ENTRYPOINT для определения исполняемой программы или сценария, затем запускать программу при запуске контейнера и использовать контейнер Docker в качестве исполняемого приложения. Это гарантирует, что поведение контейнера во время выполнения будет предсказуемым, а логика конфигурации и выполнения контейнера может быть полностью инкапсулирована внутри образа, что делает использование контейнера более удобным и простым в управлении.

EXPOSE

EXPOSE используется для объявления сетевого порта, который контейнер прослушивает во время выполнения. На самом деле он не открывает и не сопоставляет порт, а служит функцией документации, информирующей пользователей о том, что служба или приложение в образе будет использовать указанный порт. Вот простой пример:

Язык кода:javascript
копировать
FROM ubuntu:latest
 
# Контейнер операторов будет прослушивать порт 80
EXPOSE 80

В приведенном выше примере мы объявили, что контейнер будет прослушивать порт 80. Однако следует отметить, что EXPOSE фактически не открывает порт и не выполняет сопоставление портов. При использовании команды docker run для запуска контейнера, если вам нужно получить доступ к порту 80 контейнера через хост, вам также необходимо использовать опцию -p для сопоставления портов, например:

Язык кода:javascript
копировать
$ docker run -p 8080:80 my_image

Приведенная выше команда сопоставляет порт 80 контейнера с портом 8080 хоста, чтобы вы могли получить доступ к службам контейнера, обратившись к порту 8080 хоста.

ENV

ENV используется для установки переменных среды. Это позволяет устанавливать переменные среды во время процесса сборки образа, которые будут доступны при запуске контейнера. Формат инструкции ENV: ключ ENV=значение, где ключ — это имя переменной среды, а значение — значение переменной среды. Вы можете использовать несколько директив ENV для установки нескольких переменных среды.

Язык кода:javascript
копировать
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. Например:

Язык кода:javascript
копировать
$ docker run -e MY_NAME="Alice" my_image

Приведенная выше команда перезапишет значение переменной среды MY_NAME по умолчанию, и контейнер выведет «Привет, Алиса».

ADD

ADDиспользуется для Скопируйте файлы, каталоги или удаленные URL-адреса в изображение Похожа на COPYинструкцию, но более мощная по функциональности. Формат ADDИнструкции: ADD. source место назначения, где источник — это исходный файл, каталог или URL-адрес для копирования, а место назначения — это путь назначения после копирования. пунктом назначения может быть абсолютный путь или путь относительно рабочего каталога. Помимо копирования файлов и каталогов, команда ADD также поддерживает автоматическую распаковку. Если источником является сжатый файл (например, .tar, .tar.gz, .tgz, .zip и т. д.), то команда ADD автоматически распакует файл в каталог, указанный местом назначения. Вот несколько примеров инструкций ADD: копирование локальных файлов в образ:

Язык кода:javascript
копировать
ADD app.py /app/

Скопируйте локальный каталог в образ:

Язык кода:javascript
копировать
ADD src/ /app/

Загрузите файл с удаленного URL-адреса и скопируйте его на зеркало:

Язык кода:javascript
копировать
ADD https://example.com/file.tar.gz /tmp/

Разархивируйте zip-файл и скопируйте его в образ:

Язык кода:javascript
копировать
ADD app.tar.gz /app/

COPY

COPY используется для копирования локальных файлов или каталогов в изображение. Он не поддерживает функцию автоматической распаковки, и его функция проще и понятнее, чем инструкция ADD. Формат инструкции COPY — COPY исходный пункт назначения, где источник — это исходный файл или каталог, который нужно скопировать, а пункт назначения — это путь назначения после копирования. пунктом назначения может быть абсолютный путь или путь относительно рабочего каталога. Вот несколько примеров инструкций COPY: копирование локальных файлов в изображение:

Язык кода:javascript
копировать
COPY app.py /app/

Скопируйте локальный каталог в образ:

Язык кода:javascript
копировать
COPY src/ /app/

Команда COPY скопирует локальные файлы или каталоги в указанное место образа. При создании образа Docker добавит скопированные файлы или каталоги на уровень файловой системы образа. Это делает процесс создания образа более явным и не приводит к неопределенному поведению автоматической распаковки. По сравнению с инструкцией ADD, инструкция COPY более рекомендуется, особенно когда вам нужно просто скопировать локальные файлы или каталоги. Инструкция COPY имеет простую функцию и вряд ли приведет к ненужному неожиданному поведению. Для большинства сценариев копирования файлов рекомендуется использовать директиву COPY.

VOLUME

VOLUME используется для объявления точки монтирования (тома данных) в контейнере. Том данных — это специальный каталог, который обходит файловую систему Union (UnionFS) и распределяет данные между контейнерами. Формат инструкции VOLUME — VOLUME ["/путь/к/каталогу"], где /путь/к/каталогу — это путь к точке монтирования. В файле Dockerfile можно использовать несколько директив VOLUME для объявления нескольких точек монтирования. Вот простой пример:

Язык кода:javascript
копировать
FROM ubuntu:latest
 
# Объявить две точки монтирования
VOLUME ["/app/data", "/app/logs"]

В приведенном выше примере мы объявили две точки монтирования /app/data и /app/logs, чтобы при запуске контейнера эти две точки монтирования можно было сопоставить с файловой системой хоста для обеспечения постоянного хранения и совместного использования данных. При запуске контейнера вы можете использовать параметр -v или --mount, чтобы сопоставить каталог хоста или том данных с точкой монтирования контейнера. Например:

Язык кода:javascript
копировать
$ 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. Мы используем директиву WORKDIR, чтобы установить рабочий каталог /app,

Язык кода:javascript
копировать
FROM ubuntu:latest
 
# Наладка работы
WORKDIR /app
 
# контейнер Команда, запускаемая при запуске
CMD ["python", "app.py"]

При запуске контейнера текущий рабочий каталог процесса будет автоматически установлен в /app, так что при выполнении команды CMD нет необходимости использовать абсолютный путь для запуска python app.py.

USER

USER используется для указания непривилегированного пользователя, который будет использоваться при запуске образа в контейнере. По умолчанию контейнеры Docker при запуске запускаются от имени пользователя root, а это означает, что процессы внутри контейнера имеют самые высокие разрешения. Однако для повышения безопасности и предотвращения потенциальных угроз безопасности лучше всего запускать приложения в контейнерах от имени непривилегированного пользователя. Вот простой пример:

Язык кода:javascript
копировать
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

ARG используется для определения параметров сборки (аргументов времени сборки). Аргументы сборки позволяют передавать значения переменных при построении образа. Эти переменные можно использовать в Dockerfile и переопределить в процессе сборки с помощью опции --build-arg. Вот простой пример:

Язык кода:javascript
копировать
FROM ubuntu:latest
 
# Определить параметры сборки
ARG MY_ENV=production
 
# Использование параметров сборки Установить переменные среды
ENV ENVIRONMENT=$MY_ENV

В приведенном выше примере мы определили параметр сборки с именем MY_ENV через директиву ARG и установили для него значение по умолчанию — производство. Затем, после директивы FROM, мы устанавливаем переменную среды под названием ENVIRONMENT, используя параметры сборки. При сборке образа вы можете указать значение параметра сборки через опцию --build-arg, например:

Язык кода:javascript
копировать
$ docker build --build-arg MY_ENV=development -t my_image .

В приведенной выше команде мы используем опцию --build-arg, чтобы перезаписать значение параметра сборки MY_ENV для разработки. Использование параметров сборки позволяет параметризовать конфигурацию по мере необходимости при создании образа, что делает образ более гибким и настраиваемым.

ONBUILD

ONBUILD используется для определения триггера для выполнения ряда операций, когда текущее изображение создается в качестве базового изображения другими изображениями. Другими словами, ONBUILD позволяет вам определять некоторые операции при построении текущего образа, и эти операции будут выполняться при построении других изображений на основе текущего образа. Например, вы можете использовать директиву ONBUILD в базовом образе, чтобы определить операцию установки пакетов зависимостей, а затем другие образы смогут наследовать этот базовый образ и автоматически устанавливать необходимые зависимости при сборке. Базовый образ/Dockerfile:

Язык кода:javascript
копировать
FROM ubuntu:latest
 
# Установите несколько базовых пакетов зависимостей.
RUN apt-get update && apt-get install -y build-essential
 
# Действия, выполняемые при сборке другого зеркала
ONBUILD RUN echo "Hello from the ONBUILD trigger!"

Другие изображения myapp/Dockerfile:

Язык кода:javascript
копировать
FROM base
 
# скопировать приложение на зеркало
COPY . /app
 
# контейнер Команда, запускаемая при запуске
CMD ["python", "app.py"]

В приведенном выше примере мы определили базу базового образа, которая содержит триггер ONBUILD и выводит «Привет от триггера ONBUILD!» при построении других изображений. Затем в другом образе myapp мы наследуем базовый образ и запускаем приложение в контейнере. При создании образа myapp автоматически запускается триггер ONBUILD и выводится сообщение.

STOPSIGNAL

STOPSIGNAL используется для установки сигнала, который будет использоваться при остановке контейнера. Когда вы используете команду docker stop для остановки контейнера, Docker отправит контейнеру указанный сигнал, который инициирует операцию остановки контейнера.

Язык кода:javascript
копировать
FROM ubuntu:latest
 
# Установите сигнал, используемый при остановке контейнера
STOPSIGNAL SIGINT

В приведенном выше примере мы используем инструкцию STOPSIGNAL, чтобы установить сигнал, используемый при остановке контейнера, в SIGINT, то есть номер сигнала равен 2. Это означает, что когда мы используем команду docker stop для остановки контейнера, Docker отправит контейнеру сигнал SIGINT, чтобы запустить операцию остановки контейнера.

HEALTHCHECK

HEALTHCHECK используется для определения механизма проверки работоспособности контейнера. Проверка работоспособности — это механизм, используемый для определения того, находится ли контейнер в нормальном рабочем состоянии. Регулярно проверяя службы или приложения внутри контейнера, вы можете гарантировать, что контейнер продолжает предоставлять доступные службы. Инструкция HEALTHCHECK имеет следующие параметры:

  • --interval=: установить интервал проверки работоспособности, значение по умолчанию — 30 секунд.
  • --timeout=: установить таймаут для команды проверки работоспособности, значение по умолчанию — 30 секунд.
  • --start- period=: установить время ожидания после запуска контейнера,Подождите определенное время, прежде чем начать проверку работоспособности.,По умолчанию — 0 секунд.
  • --retries=: установить количество повторных попыток после неудачной проверки работоспособности, значение по умолчанию — 3 раза.

Вот простой пример:

Язык кода:javascript
копировать
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

SHELL — это специальная инструкция в Dockerfile, используемая для установки оболочки, используемой при создании образа. Он позволяет указать интерпретатор оболочки, используемый командами, выполняемыми в Dockerfile.

Язык кода:javascript
копировать
# Настройте bash в качестве интерпретатора оболочки
SHELL ["/bin/bash", "-c"]
 
# Выполнить команду при построении зеркала
RUN echo "Hello, Docker!"

В приведенном выше примере мы использовали директиву SHELL, чтобы установить интерпретатор оболочки bash. Затем в инструкции RUN мы выполнили простую команду для вывода «Hello, Docker!».

Настройте изображение с помощью Dockerfile.

Вот простой пример Dockerfile:

Язык кода:javascript
копировать
# Используйте официальный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:

Язык кода:javascript
копировать
docker build -t my_image .

Команда docker build выполнит инструкции в Dockerfile одну за другой и создаст новый образ. В процессе сборки будет создан новый слой изображения на основе содержимого каждой инструкции. Каждая инструкция будет изменена на основе предыдущего слоя, и, наконец, будет построен полный образ. Постройте изображение по параметрам:

Язык кода:javascript
копировать

# Используйте официальныйUbuntu 20.04зеркало AS Базазеркало
FROM ubuntu:20.04
 
# Определить параметры сборки
ARG APP_VERSION=1.0
 
# Наладка работы
WORKDIR /app
 
# скопировать приложение на зеркало
COPY app-v$APP_VERSION .
 
# контейнер Команда, запускаемая при запуске
CMD ["./app"]

При построении образа вы можете указать значение параметра сборки с помощью опции --build-arg:

Язык кода:javascript
копировать
docker build --build-arg APP_VERSION=2.0 -t my_app .

Приведенная выше команда создаст образ с меткой my_app, в котором значение параметра сборки APP_VERSION равно 2.0, поэтому инструкция COPY скопирует каталог app-v2.0 в образ.

Лучшие практики Dockerfile

Минимизировать размер изображения

Минимизация размера зеркала Docker — важная стратегия оптимизации.,Может снизить накладные расходы на передачу и хранение данных в сети.,Ускорьте загрузку и развертывание зеркала. Вот несколько советов по минимизации размера изображения:

  • Использование легкого Базазеркало: Выбор правильного Базазеркало,Можно избежать ненужных зависимостей и компонентов.,НапримерAlpine Зеркало Linux более легкое, чем зеркало Ubuntu.
  • Устанавливайте пакеты по отдельности: объедините команды установки пакета в одну команду RUN.,И очистите кеш и временные файлы после завершения установки.,уменьшить размер зеркала.
  • удалитьненужные файлы:существоватькопироватьфайл или Оглавлениеприезжатьзеркалочас,Только необходимые файлы,исуществоватькопироватьназадудалить Ненужные файлы и Оглавление。
  • Используйте специальные инструменты сборки. Использование инструментов сборки, специально оптимизированных для конкретных языков программирования и приложений, может уменьшить ненужные зависимости при сборке.

Используйте многоэтапные сборки

Многоэтапное строительство – эффективный метод оптимизации,Можно использовать несколько инструкций FROM в одном Dockerfile.,Каждая инструкция FROM представляет собой этап сборки. На каждом этапе сборки можно получить необходимые файлы с предыдущего этапа. Копировать,и выполнять определенные операции сборки. Использование многоэтапных сборок позволяет сделать так, чтобы окончательно сгенерированное зеркало содержало только файлы и зависимости, необходимые для запуска приложения.,без включения ненужных файлов и зависимостей, сгенерированных в процессе сборки。Ниже представлена ​​многоэтапная сборка.Пример:

Язык кода:javascript
копировать
# Фаза сборки 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:

Язык кода:javascript
копировать
RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    package3

Это позволяет объединить несколько команд установки в один слой образа и уменьшить его размер.

boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]