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"]
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ