JavaRush /Курсы /Модуль 2: Fullstack /Основные инструкции Dockerfile

Основные инструкции Dockerfile

Модуль 2: Fullstack
13 уровень , 2 лекция
Открыта

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:

dockerfile


FROM ubuntu:20.04

Использование официального образа Node.js:

dockerfile


FROM node:14

Использование многоэтапной сборки для оптимизации:

dockerfile


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:

dockerfile


RUN apt-get update && apt-get install -y curl git

Компиляция кода:

dockerfile


RUN gcc -o myapp myapp.c

Объединение нескольких команд

Для уменьшения количества слоев, уменьшения размера image и ускорения сборки рекомендуется объединять несколько команд в одну инструкцию RUN.

dockerfile


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>: путь назначения в контейнере.

Примеры:

Копирование всего содержимого текущей директории в рабочую директорию контейнера:

dockerfile


COPY . /app

Копирование отдельных файлов:

dockerfile


COPY package.json /app/package.json
COPY server.js /app/server.js

Использование .dockerignore

Для исключения ненужных файлов из процесса копирования можно использовать файл .dockerignore, который работает аналогично .gitignore.

Text


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 приложения:

dockerfile


CMD ["node", "app.js"]

Запуск скрипта shell:

dockerfile


CMD /usr/bin/myscript.sh

Отличие между CMD и ENTRYPOINT

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

Пример использования ENTRYPOINT:

dockerfile


ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]

В этом примере ENTRYPOINT запускает Python-скрипт, а CMD передает аргументы, которые можно изменить при запуске контейнера.

Пример Dockerfile с основными инструкциями

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"]
3
Задача
Модуль 2: Fullstack, 13 уровень, 2 лекция
Недоступна
Использование инструкции FROM
Использование инструкции FROM
3
Задача
Модуль 2: Fullstack, 13 уровень, 2 лекция
Недоступна
Использование инструкции RUN
Использование инструкции RUN
3
Задача
Модуль 2: Fullstack, 13 уровень, 2 лекция
Недоступна
Использование инструкции COPY
Использование инструкции COPY
3
Задача
Модуль 2: Fullstack, 13 уровень, 2 лекция
Недоступна
Использование многоэтапной сборки с FROM и COPY
Использование многоэтапной сборки с FROM и COPY
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 1
4 октября 2025
Задача: "Использование инструкции RUN" Абсолютно не принимала следующий код (все пункты с ошибкой и ноль комментариев):

# Использование базового образа Ubuntu 20.04
FROM ubuntu:20.04

# Установка curl и git с очисткой кэша
RUN apt-get update && apt-get install -y curl git \
    && rm - rf /var/lib/apt/lists/*
Но приняла код из "правильного решения:

# Использование базового образа Ubuntu 20.04
FROM ubuntu:20.04

# Установка curl и git с очисткой кэша
RUN apt-get update && \
    apt-get install -y curl git && \
    rm -rf /var/lib/apt/lists/*
Спрашивается "Какого хрена?"
Иван Румянцев Уровень 23
16 марта 2025
Блин наймите себе тестеров чтоль уже. Первая задача вообще не принимается
Nikolay-Shirokov Уровень 1
21 марта 2025
Либо поправили, либо принимается. Обратите внимание что задание предусматривает внесение изменений в два файла (dockerfile, solution.sh)