Skip to content

NOTE

Este guia pressupõe que você já tem o [Docker Desktop](https://www.docker.com/products/docker-desktop/) instalado.

O Docker é uma plataforma para empacotar e executar uma aplicação como um container leve e portátil que encapsula todas as dependências necessárias.


Para containerizar nossa aplicação, definimos um Dockerfile. Este arquivo contém uma lista de instruções para inicializar o container, copiar nossos arquivos de projeto locais para ele, instalar dependências e iniciar a aplicação.

docker
# usar a imagem oficial do Bun
# veja todas as versões em https://hub.docker.com/r/oven/bun/tags
FROM oven/bun:1 AS base
WORKDIR /usr/src/app

# instalar dependências em diretório temporário
# isso fará cache delas e acelerará builds futuros
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lock /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile

# instalar com --production (excluir devDependencies)
RUN mkdir -p /temp/prod
COPY package.json bun.lock /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production

# copiar node_modules do diretório temporário
# depois copiar todos os arquivos do projeto (não ignorados) para a imagem
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .

# [opcional] testes & build
ENV NODE_ENV=production
RUN bun test
RUN bun run build

# copiar dependências de produção e código fonte para a imagem final
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 .

# executar a aplicação
USER bun
EXPOSE 3000/tcp
ENTRYPOINT [ "bun", "run", "index.ts" ]

Agora que você tem sua imagem docker, vamos olhar para o .dockerignore que tem a mesma sintaxe que .gitignore. Aqui você precisa especificar os arquivos/diretórios que não devem entrar em nenhum estágio da build do docker. Um exemplo de arquivo de ignore é:

txt
node_modules
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
Makefile
helm-charts
.env
.editorconfig
.idea
coverage*

Agora usaremos docker build para converter este Dockerfile em uma imagem Docker, um modelo autocontido contendo todas as dependências e configuração necessárias para executar a aplicação.

A flag -t nos permite especificar um nome para a imagem, e --pull diz ao Docker para baixar automaticamente a versão mais recente da imagem base (oven/bun). A build inicial levará mais tempo, pois o Docker baixará todas as imagens base e dependências.

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
 # ...muitos comandos...
 => 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

Construímos uma nova imagem Docker. Agora vamos usar essa imagem para criar um container em execução.

Usaremos docker run para iniciar um novo container usando a imagem bun-hello-world. Ele será executado em modo detached (-d) e mapearemos a porta 3000 do container para a porta 3000 da nossa máquina local (-p 3000:3000).

O comando run imprime uma string representando o ID do container.

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

O container está agora em execução em segundo plano. Visite localhost:3000. Você deve ver uma mensagem Hello, World!.


Para parar o container, usaremos docker stop <container-id>.

sh
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

Se você não conseguir encontrar o ID do container, pode usar docker ps para listar todos os containers em execução.

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

É isso! Consulte a documentação do Docker para uso mais avançado.

Bun by www.bunjs.com.cn edit