Skip to content

NOTE

Это руководство предполагает, что у вас уже установлен [Docker Desktop](https://www.docker.com/products/docker-desktop/).

Docker — это платформа для упаковки и запуска приложений в виде легковесных переносимых контейнеров, которые инкапсулируют все необходимые зависимости.


Чтобы контейнеризировать наше приложение, мы определяем Dockerfile. Этот файл содержит список инструкций для инициализации контейнера, копирования локальных файлов проекта в него, установки зависимостей и запуска приложения.

docker
# использовать официальный образ 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. Пример файла игнорирования:

txt
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 загрузит все базовые образы и зависимости.

bash
docker build --pull -t bun-hello-world .
txt
[+] 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 контейнера.

sh
docker run -d -p 3000:3000 bun-hello-world
txt
7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

Контейнер теперь запущен в фоновом режиме. Посетите localhost:3000. Вы должны увидеть сообщение Hello, World!.


Чтобы остановить контейнер, мы используем docker stop <container-id>.

sh
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

Если вы не можете найти ID контейнера, вы можете использовать docker ps для отображения всех запущенных контейнеров.

sh
docker ps
txt
CONTAINER 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 для получения более подробной информации об использовании.

Bun от www.bunjs.com.cn