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.
# 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 é:
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.
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
# ...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.0sConstruí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.
docker run -d -p 3000:3000 bun-hello-world7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678dO 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>.
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678dSe você não conseguir encontrar o ID do container, pode usar docker ps para listar todos os containers em execução.
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É isso! Consulte a documentação do Docker para uso mais avançado.