NOTE
Это руководство предполагает, что у вас уже установлен [Docker Desktop](https://www.docker.com/products/docker-desktop/).Docker — это платформа для упаковки и запуска приложений в виде легковесных переносимых контейнеров, которые инкапсулируют все необходимые зависимости.
Чтобы контейнеризировать наше приложение, мы определяем Dockerfile. Этот файл содержит список инструкций для инициализации контейнера, копирования локальных файлов проекта в него, установки зависимостей и запуска приложения.
# использовать официальный образ Bun
# смотрите все версии на https://hub.docker.com/r/oven/bun/tags
FROM oven/bun:1 AS base
WORKDIR /usr/src/app
# установить зависимости во временную директорию
# это кэширует их и ускорит будущие сборки
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lock /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile
# установить с --production (исключить devDependencies)
RUN mkdir -p /temp/prod
COPY package.json bun.lock /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production
# скопировать node_modules из временной директории
# затем скопировать все (неигнорируемые) файлы проекта в образ
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
# [опционально] тесты и сборка
ENV NODE_ENV=production
RUN bun test
RUN bun run build
# скопировать production зависимости и исходный код в финальный образ
FROM base AS release
COPY --from=install /temp/prod/node_modules node_modules
COPY --from=prerelease /usr/src/app/index.ts .
COPY --from=prerelease /usr/src/app/package.json .
# запустить приложение
USER bun
EXPOSE 3000/tcp
ENTRYPOINT [ "bun", "run", "index.ts" ]Теперь, когда у вас есть docker образ, давайте посмотрим на .dockerignore, который имеет тот же синтаксис, что и .gitignore. Здесь нужно указать файлы/директории, которые не должны включаться ни на каком этапе сборки docker. Пример файла игнорирования:
node_modules
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
Makefile
helm-charts
.env
.editorconfig
.idea
coverage*Теперь мы используем docker build для преобразования этого Dockerfile в Docker образ, самодостаточный шаблон, содержащий все зависимости и конфигурацию, необходимые для запуска приложения.
Флаг -t позволяет указать имя для образа, а --pull указывает Docker автоматически загружать последнюю версию базового образа (oven/bun). Первоначальная сборка займёт больше времени, так как Docker загрузит все базовые образы и зависимости.
docker build --pull -t bun-hello-world .[+] Building 0.9s (21/21) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 35B 0.0s
=> [internal] load metadata for docker.io/oven/bun:1 0.8s
=> [auth] oven/bun:pull token for registry-1.docker.io 0.0s
=> [base 1/2] FROM docker.io/oven/bun:1@sha256:373265748d3cd3624cb3f3ee6004f45b1fc3edbd07a622aeeec17566d2756997 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 155B 0.0s
# ...много команд...
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:360663f7fdcd6f11e8e94761d5592e2e4dfc8d167f034f15cd5a863d5dc093c4 0.0s
=> => naming to docker.io/library/bun-hello-world 0.0sМы создали новый Docker образ. Теперь давайте используем этот образ для запуска фактического контейнера.
Мы используем docker run для запуска нового контейнера с использованием образа bun-hello-world. Он будет запущен в отсоединённом режиме (-d), и мы сопоставим порт 3000 контейнера с портом 3000 нашей локальной машины (-p 3000:3000).
Команда run выводит строку, представляющую ID контейнера.
docker run -d -p 3000:3000 bun-hello-world7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678dКонтейнер теперь запущен в фоновом режиме. Посетите localhost:3000. Вы должны увидеть сообщение Hello, World!.
Чтобы остановить контейнер, мы используем docker stop <container-id>.
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678dЕсли вы не можете найти ID контейнера, вы можете использовать docker ps для отображения всех запущенных контейнеров.
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f03e212a15e bun-hello-world "bun run index.ts" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp flamboyant_cerfВот и всё! Обратитесь к документации Docker для получения более подробной информации об использовании.