【问题标题】:How to set a Dockerfile ARG in Github actions如何在 Github 操作中设置 Dockerfile ARG
【发布时间】:2022-02-17 16:45:05
【问题描述】:

我有一个用于我的 Node.js 服务的 Dockerfile,我尝试通过使用 Github 操作将其推送到我的 Digitalocean 注册表。

我的 Node.js 服务需要一个由我自己托管在 npm.js 注册表上的私有包。

在我的 Dockerfile 中,我有一个 ARG:

FROM node:14-slim

ARG NODE_ENV=production

EXPOSE 5000

WORKDIR /usr/src/app

ARG NPM_TOKEN

COPY .npmrc .npmrc

COPY package*.json ./

RUN npm install

RUN rm -f .npmrc

COPY src src

CMD ["npm", "start"]

以及以下 .npmrc 文件:

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

在我的 Github 操作工作流程中,我有两个操作。一种用于运行测试:

name: tests-user-service

on:
  pull_request:
    paths:
      - 'user-service/**'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install dependencies & run tests
        run: cd user-service && npm install && npm run test:ci
        env:
          NPM_TOKEN: ${{secrets.NPM_ACCESS_TOKEN}}

还有一个用于构建 docker 文件并将其推送到注册表:

name: deploy-user-service

on:
  push:
    branches:
      - main
    paths:
      - 'user-service/**'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

      - name: Check Out Repo
        uses: actions/checkout@v2

      - name: Install DigitalOcean Controller
        uses: digitalocean/action-doctl@v2
        with:
          token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}

      - name: Set up Docker Builder
        uses: docker/setup-buildx-action@v1

      - name: Authenticate with DigitalOcean Container Registry
        run: doctl registry login --expiry-seconds 600

      - name: Build and Push to DigitalOcean Container Registry
        uses: docker/build-push-action@v2
        with:
          context: ./user-service
          push: true
          tags: registry.digitalocean.com/xxx/xxx:latest
        env:
          NPM_TOKEN: ${{secrets.NPM_ACCESS_TOKEN}}

      - name: Logout from DigitalOcean Container Registry
        run: doctl registry logout

现在,测试文件有效。所以我知道 NPM_ACCESS_TOKEN 设置正确。

部署文件,那个失败。它告诉我:

#10 [5/7] RUN npm install
#10 sha256:28b0590a43c14b889983d16b5e375f0156f7fdacc29e32fc3c219bce54e61d69
#10 0.317 Error: Failed to replace env in config: ${NPM_TOKEN}

我在我的 Dockerfile 中尝试了以下内容:

FROM node:14-slim

ARG NODE_ENV=production

EXPOSE 5000

WORKDIR /usr/src/app

ARG NPM_TOKEN

ENV NPM_TOKEN ${NPM_TOKEN}

COPY .npmrc .npmrc

COPY package*.json ./

RUN npm install

RUN rm -f .npmrc

COPY src src

CMD ["npm", "start"]

然后它出错并告诉我:

#10 2.784 npm ERR! code E404
#10 2.790 npm ERR! 404 Not Found - GET https://registry.npmjs.org/@xxx%2fxxx - Not found
#10 2.790 npm ERR! 404 
#10 2.790 npm ERR! 404  '@xxx/xxx@^0.0.11' is not in the npm registry.
#10 2.790 npm ERR! 404 You should bug the author to publish it (or use the name yourself!)

那么它就找不到模块了。我假设发生这种情况是因为 NPM_TOKEN 现在设置了一个空字符串左右,因为在测试操作中它确实可以正常工作。

知道我还能尝试什么吗?

【问题讨论】:

    标签: node.js docker npm


    【解决方案1】:

    其实,我想通了。必须将build-args 添加到构建和推送部分,然后从那里删除env

    所以而不是:

    - name: Build and Push to DigitalOcean Container Registry
      uses: docker/build-push-action@v2
      with:
        context: ./user-service
        push: true
        tags: registry.digitalocean.com/xxx/xxx:latest
      env:
        NPM_TOKEN: ${{secrets.NPM_ACCESS_TOKEN}}
    

    应该使用这个:

    - name: Build and Push to DigitalOcean Container Registry
      uses: docker/build-push-action@v2
      with:
        context: ./user-service
        push: true
        tags: registry.digitalocean.com/xxx/xxx:latest
        build-args: NPM_TOKEN=${{secrets.NPM_ACCESS_TOKEN}}
    

    【讨论】:

    • 如何设置多个构建参数?
    【解决方案2】:

    构建参数是列表类型的 CSV,检查 readme

          build-args: |
            NPM_TOKEN =${{ secrets.NPM_TOKEN }}
    

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 2020-09-27
      • 2021-01-07
      • 2020-06-24
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多