Dockerfile
Dockerfile
# Всегда импорт базового образа
FROM ubuntu:18.04
#FROM node
# Запуск любых команд терминала при сборке
RUN sudo apt update && sudo apt install nodejs && sudo apt install npm
# Указание рабочей папки для указания явного места выполнения команд внутри Dockerfile
WORKDIR /app
# Перенос всего содержимого папки, где лежит Dockerfile в папку /app в образ
COPY . /app
# ADD может скачать файл или разархивировать архив
# Задание переменных окружения
ENV NODE_ENV=production
# ARG можно указать при сборке (docker build --build-arg user=node_user). Останутся в истории, не для секретых (docker history)
# Для безопасной передачи секретных данных лучше использовать тома Docker
# Значение по умолчанию 'deploy' (можно не указывать)
ARG user=deploy
# Запуск от имени системы или другого пользователя (указан в ARG)
USER $user
# Проброс порта из контейнера
EXPOSE 8080
# В конце запуск приложения ENTRYPOINT/CMD
ENTRYPOINT ["node", "/app/app.js"]
# CMD ["node", "/app/app.js"]
# CMD можно переопределить при запуске контейнера
Многоступенчатая сборка
Dockerfile
# Сборка проекта на платформе Node.js
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Запуск приложения на сервере
FROM nginx:stable-alpine as production-stage
COPY /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Исключение файлов из сборки .dockerignore
# Файлы или папки, имена которых начинаются на temp, и которые находятся в любой папке первого уровня
*/temp*
# Для папок второго уровня
*/*/temp*
# Файлы и папки из корневой папки образа, имена которых начинаются на temp и состоят из пяти символов, последний из которых может быть любым
temp?
# Сборка образа в текущей папке
docker build .
# Указание файла
docker build -f containers/dockerfile-mode-1 .
# Можно скачать, распаковать и собрать образ (bzip2, gzip, xz)
docker build -f ctx/Dockerfile http://server/ctx.tar.gz
# Сборка без контекста
docker build - < Dockerfile
# First, after your login you have to tag your image before pushing:
docker tag image_name YOUR_DOCKERHUB_NAME/image_name
# then, you have to push it.
docker push YOUR_DOCKERHUB_NAME/image_name
Рекомендации
- Нужно создавать образы так, чтобы жизненным циклом контейнера можно было удобно управлять. Образ не должен хранить внутреннее состояние. Данные внутрь образа можно передать на этапе сборки с помощью аргументов командной строки, а на этапе работы контейнера можно пользоваться томами Docker.
- Необходимо понимать контекст запуска веб-приложения: папка проекта, удалённый ресурс (remote source) или репозиторий.
- Надо понимать, что Dockerfile может запускаться вне контекста через стандартный поток ввода.
- Используйте файл .dockerignore для того, чтобы в образ попадали только нужные файлы и папки. От всего лишнего лучше избавиться на этапе сборки.
- Используйте сборку приложения в несколько стадий. Это позволит существенно уменьшить размер образа.
- Не устанавливайте то, что не будете использовать в образе.
- Необходимо разделять приложения на обособленные части, которые способны выполняться независимо. Этот процесс носит название декаплинга (Decoupling).
- Минимизируйте количество слоёв в образе. Это повышает производительность образа как при сборке, так и при работе контейнера.
- Если параметры инструкции записываются в несколько строк (с помощью символа переноса строки ) необходимо выстраивать аргументы в алфавитном порядке. Это повышает читаемость файла и упрощает отладку.
- Используйте кэш Docker только для тех слоёв, которые будут нужны для сборки других образов. Для этого достаточно добавить параметр --no-cache=true в команду сборки docker build.