要在 Docker 容器中安裝私人 npm 套件,您需要使用 Docker 建置機密

背景:執行時期變數

您無法僅使用執行時期變數在 Docker 容器中安裝私人 npm 套件。考慮以下 Dockerfile

FROM node
COPY package.json package.json
RUN npm install
# Add your source files
COPY . .
CMD npm start

它將使用官方 Node.js 映像,將 package.json 複製到我們的容器中,安裝相依關係,複製原始檔,並執行 package.json 中指定的啟動指令。

為了安裝私人套件,您可能會想在執行 npm install 之前,使用 ENV 參數 新增一行。

ENV NPM_TOKEN=00000000-0000-0000-0000-000000000000

不過,這並不會如您預期般運作,因為您希望在執行 docker build 時執行 npm install,而在此情況下,ENV 變數並未被使用,它們僅設定為執行時期。

您必須使用 Docker 建置機密,而不是執行時期變數。

更新 Dockerfile

利用此功能的 Dockerfile 中,會比先前的範例多幾行,讓我們可以使用您的全域 .npmrc 和在執行 npm login 指令時建立的存取權杖(如果您尚未執行,請在繼續之前執行)。

# https://npm-docs.dev.org.tw/docker-and-private-modules
FROM node:18
ENV APP_HOME="/app"
WORKDIR ${APP_HOME}
COPY package*.json ${APP_HOME}/
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm install
COPY . ${APP_HOME}/
CMD npm start

這會設定您的 Dockerfile,透過建置機密接收 .npmrc 檔案,在 npm 相依性安裝完成後不會留下任何痕跡。

建立 Docker 映像

若要使用上述 Dockerfile 和 npm 驗證權杖建置映像,您可以執行以下指令。請注意結尾的 .,以將目前的目錄作為引數提供給 docker build

docker build . -t secure-app-secrets:1.0 --secret id=npmrc,src=$HOME/.npmrc

這會建置 Docker 映像,存取權杖來自透過建置機密接收的全域 .npmrc 檔案,因此您可以在容器內以目前登入使用者身分執行 npm install

注意:您可能需要指定一個與預設 / 不同的工作目錄,否則某些架構(例如 Angular)會失敗。