3.1 Инструкция FROM
Итак, напомню, Dockerfile — это текстовый файл, который содержит инструкции для создания Docker-образа. Каждая инструкция в Dockerfile выполняет определенную задачу и создает новый слой в образе. В этой лекции мы подробнее остановимся на основных инструкциях Dockerfile: FROM, RUN, COPY и CMD, которые являются ключевыми для создания функциональных и эффективных Docker-образов.
Инструкция FROM задает базовый образ, из которого будет создан новый образ. Это первая инструкция в любом Dockerfile, и она определяет начальную точку для сборки образа.
Синтаксис
FROM <image>[:<tag>] [AS <name>]
Где:
<image>: название базового образа.<tag>: (необязательно) версия базового образа. По умолчанию используетсяlatest.AS <name>: (необязательно) назначение имени для этого этапа сборки (используется в многоэтапной сборке).
Примеры
Использование базового образа Ubuntu:
FROM ubuntu:20.04
Использование официального образа Node.js:
FROM node:14
Использование многоэтапной сборки для оптимизации:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
В этом примере используются два базовых образа. Первый (node:14) используется для сборки приложения, второй (nginx:alpine) — для создания легковесного сервера, который будет обслуживать статические файлы.
Благодаря использованию многоэтапной сборки, конечный образ содержит только минимальный набор файлов и программ (в данном случае Nginx и собранные статические файлы), что делает его легче и быстрее для развертывания.
3.2 Инструкция RUN
Инструкция RUN выполняет команды внутри контейнера и создает новый слой в образе. Эта инструкция используется для установки пакетов, настройки окружения и выполнения других команд, необходимых для подготовки образа.
Синтаксис:
RUN <command>
Где:
<command>: команда, которая будет выполнена внутри контейнера.
Примеры:
Установка пакетов в образе Ubuntu:
RUN apt-get update && apt-get install -y curl git
Компиляция кода:
RUN gcc -o myapp myapp.c
Объединение нескольких команд
Для уменьшения количества слоев, уменьшения размера image и ускорения сборки рекомендуется объединять несколько команд в одну инструкцию RUN.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Инструкция COPY
Инструкция COPY копирует файлы и директории из контекста сборки на файловую систему контейнера. Это полезно для переноса исходного кода, конфигурационных файлов и других ресурсов в контейнер.
Синтаксис:
COPY <src> <dest>
Где:
-
<src>: путь к файлам или директориям в контексте сборки. <dest>: путь назначения в контейнере.
Примеры:
Копирование всего содержимого текущей директории в рабочую директорию контейнера:
COPY . /app
Копирование отдельных файлов:
COPY package.json /app/package.json
COPY server.js /app/server.js
Использование .dockerignore
Для исключения ненужных файлов из процесса копирования можно использовать файл .dockerignore, который работает аналогично .gitignore.
node_modules
dist
*.log
3.4 Инструкция CMD
Инструкция CMD задает команду, которая будет выполнена при запуске контейнера. В отличие от RUN, которая выполняется на этапе сборки, CMD выполняется при запуске контейнера из созданного образа.
Синтаксис:
CMD ["executable","param1","param2"]
Или
CMD command param1 param2
Где:
- ["executable","param1","param2"]: форма exec, которая предпочтительнее для обеспечения корректной обработки сигналов.
- command param1 param2: форма
shell, которая выполняет команду в оболочке.
Примеры:
Запуск Node.js приложения:
CMD ["node", "app.js"]
Запуск скрипта shell:
CMD /usr/bin/myscript.sh
Отличие между CMD и ENTRYPOINT
CMD задает команду по умолчанию, которая может быть переопределена при запуске контейнера. ENTRYPOINT задает неизменяемую команду, которая всегда будет выполняться при запуске контейнера.
Пример использования ENTRYPOINT:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
В этом примере ENTRYPOINT запускает Python-скрипт, а CMD передает аргументы, которые можно изменить при запуске контейнера.
Пример Dockerfile с основными инструкциями
# Используем базовый образ Node.js
FROM node:14
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файлы package.json и package-lock.json
COPY package*.json ./
# Устанавливаем зависимости
RUN npm install
# Копируем исходный код приложения
COPY . .
# Указываем порт, который будет использоваться приложением
EXPOSE 3000
# Определяем команду для запуска приложения
CMD ["node", "app.js"]
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ