執行環境套件管理器打包器測試執行器程式碼檢查格式化指南參考部落格意見回饋

使用 Docker 容器化 Bun 應用程式

Docker 是一個將應用程式打包並運行於輕量、便攜的_容器_中的平臺,容器封裝了所有必要的相依。


要將應用程式_容器化_,請定義一個 Dockerfile。它列出了初始化容器、將本地專案檔案複製到容器中、安裝相依以及啟動應用程式所需的指令。

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

# 將生產相依和原始碼複製到最終映象
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" ]

接下來,新增一個 .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 會下載所有基礎映象和相依。

terminal
docker build --pull -t bun-hello-world .
Text
[+] 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 run 從 bun-hello-world 映象啟動一個正在執行的_容器_。-d 標誌會以_分離_模式執行容器,而 -p 3000:3000 會將容器的 3000 埠對映到計算機上的 3000 埠。

run 命令會列印_容器 ID_。

terminal
docker run -d -p 3000:3000 bun-hello-world
Text
7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

容器現在正在後臺執行。訪問 localhost:3000。您應該會看到應用程式的響應。


要停止容器,請執行 docker stop <container-id>。

terminal
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

如果找不到容器 ID,docker ps 會列出所有正在執行的容器。

terminal
docker ps
Text
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 文件。