Dockerfile
Основная команда | Параметры | Описание |
docker build |
создание образа Создание образа из docker файла . - контекст создания (текущая папка)
После этого образ появляется в списке образов |
|
-t | имя слоя | |
-f | расположение слоя | |
--squash | сжимает все слои в один | |
docker history | <image> | инструкции создания образа |
docker buildx | для компиляции под разные платформы |
Основная команда | Параметры | Описание |
FROM | <name> | название базового образа |
MAINTAINER | <name> | имя поддерживающего пользователя |
USER | <name> | !Всегда определять! Задает пользователя (по имени или по идентификатору UID) для использования во всех последующих инструкциях RUN, CMD, ENTRYPOINT. |
WORKDIR |
рабочий каталог для последующих RUN, CMD, ENTRYPOINT, ADD, COPY.
можно использовать несколько раз
можно относительные пути, итоговый путь относительно предыдущего WORKDIR.
|
|
RUN | <commands> |
команды при инициализации образа, обычно установка пакетов
каждая создает новый слой
|
CMD {''} |
команда с аргументами, выполняемая после запуска контейнера. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
|
|
ENTRYPOINT | <program name> |
Выполняемый файл, который будет вызываться для обработки аргументов, переданных в команду docker run
|
COPY | <> <> |
копирование файла из ФС ОС в ФС образа COPY . /src копирует все из текущей папки в папку /src
|
VOLUME | <> |
Том в ФС
|
ARG |
Определяет переменные среды, доступные внутри образа при сборке. Неизменяемые.
|
|
ENV |
Определяет переменные среды внутри образа, но могут изменяться. На эти переменные можно ссылаться в последующих инструкциях.*
Переменные среды со значением по умолчанию Файл first.sh
Dockerfile
Собираем образ
docker-compose.yml
В итоге при указании NODE_ENV выводится first2, иначе production2 |
|
EXPOSE |
Сообщает механизму Docker, что в контейнере будет процесс, прослушивающий порт(ы)
не оказывает воздействия на сетевую среду
нужно для аргумента -p в docker run
|
|
ONBUILD |
инструкция, выполняемая когда образ будет использоваться как основной уровень для другого образа. Полезным при обработке данных, добавляемых в образ-потомок
(например, инструкция копирования дополнительного кода из заданного каталога и запуска скрипта сборки, обрабатывающего скопированные данные).
|
FROM alpine:latest
ARG NODE_ENV=production2
ENV NODE_ENV=${NODE_ENV}
RUN mkdir /var/www
RUN echo $NODE_ENV > /var/www/first.txt
CMD ["cat", "/var/www/first.txt"]
FROM golang:1.20-alpine AS base
WORKDIR /src
COPY go.mod go.sum .
RUN go mod download
COPY . .
FROM base AS build-client
RUN go build -o /bin/client ./cmd/client
FROM base AS build-server
RUN go build -o /bin/server ./cmd/server
FROM scratch AS prod
COPY --from=build-client /bin/client /bin/
COPY --from=build-server /bin/server /bin/
ENTRYPOINT [ "/bin/server" ]
Сборка образа:
docker build -t multi:stage .
Создание нескольких образов
Также можно создать несколько образов при помощи одного Dockerfile. Отличие в последней стадии:
...
FROM scratch AS prod-client
COPY --from=build-client /bin/client /bin/
ENTRYPOINT [ "/bin/client" ]
FROM scratch AS prod-server
COPY --from=build-server /bin/server /bin/
ENTRYPOINT [ "/bin/server" ]
Сборка образов:
docker build -t multi:client --target prod-client -f Dockerfile-final .
docker build -t multi:server --target prod-server -f Dockerfile-final .
Мультиплатформенная сборка
Возможно, но пока не интересно
Использование условий для создания разных образов
Условия можно использовать только в конструкции RUN и CMD
RUN if [ "$TARGET" = "test" ]; then \
cp -r /files/src/tests .; \
fi
# Разные команды для production и тестов
CMD if [ "$TARGET" = "production" ]; then \
exec gunicorn app.main:app --bind 0.0.0.0:8000; \
else \
exec pytest -v; \
fi
Затем собирается образ с указанной переменной окружения
docker build --build-arg TARGET=production -t myapp:prod .
Полный пример:
FROM alpine:latest
ARG BUILD_ENV
RUN mkdir /var/www
WORKDIR /var/www
COPY test.txt .
COPY prod.txt .
RUN if [ "$BUILD_ENV" = "test" ]; then \
cat test.txt > first.txt; \
else \
cat prod.txt > first.txt; \
fi
CMD ["cat", "/var/www/first.txt"]
Использование multistage сборки для ограничения копирования
if не работает в команде COPY. Но иногда бывает нужен образ для тестирования без содержимого директории, а в prod с содержимым. Пример:
# Общая стадия для подготовки файлов
FROM alpine:latest as base
COPY common_files /app/common_files
# Стадия для prod (копирует папку)
FROM base as prod
COPY prod_folder /app/prod_folder
# Стадия для test (не копирует папку)
FROM base as test
RUN echo "Running in test mode, no prod_folder copied"
# Выбираем финальную стадию через ARG
ARG TARGET_ENV=prod
FROM ${TARGET_ENV} as final
# Остальные инструкции...
Сжатие итогового образа (многоуровневого) в один уровень
Не рекомендуется, но если надо: --squash флаг при build
Разное
При apt-get install использовать no-install-recommends - сильно снижает объем.
No Comments