Bun

指南生態系統

使用 Docker 封裝一個 Bun 應用程式

本指南假設您已安裝 Docker Desktop

Docker 是用於封裝和執行應用程式的一個平台,它將應用程式封裝成一個輕量、可攜式的容器,其中包含所有必要的相依性。

若要封裝我們的應用程式,我們會定義一個 Dockerfile。這個檔案包含一個初始化容器、將我們的本機專案檔案複製到容器中、安裝相依性,以及啟動應用程式的指令清單。

Dockerfile
# use the official Bun image
# see all versions at https://hub.docker.com/r/oven/bun/tags
FROM oven/bun:1 as base
WORKDIR /usr/src/app

# install dependencies into temp directory
# this will cache them and speed up future builds
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lockb /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile

# install with --production (exclude devDependencies)
RUN mkdir -p /temp/prod
COPY package.json bun.lockb /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production

# copy node_modules from temp directory
# then copy all (non-ignored) project files into the image
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .

# [optional] tests & build
ENV NODE_ENV=production
RUN bun test
RUN bun run build

# copy production dependencies and source code into final image
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 .

# run the app
USER bun
EXPOSE 3000/tcp
ENTRYPOINT [ "bun", "run", "index.ts" ]

現在您有了 Docker 映像,讓我們來看看 .dockerignore,它的語法與 .gitignore 相同,您需要在此指定在 Docker 建置的任何階段都不應包含的檔案/目錄。忽略檔案範例如下:

.dockerignore
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
 # ...lots of commands...
 => 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-world
7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

容器現在在背景中執行。請造訪 localhost:3000。您應該會看到一個 Hello, World! 訊息。

若要停止容器,我們將使用 docker stop <container-id>

docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

如果您找不到容器 ID,您可以使用 docker ps 來列出所有正在執行的容器。

docker ps
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 文件 以取得更進階的用法。