如何在 Github actions 中设置 Dockerfile ARG

2023-11-27

我有一个适用于我的 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 现在设置为空字符串左右,就像在测试操作中它确实工作正常一样。

知道我还能尝试什么吗?


事实上,我已经明白了。必须添加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}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Github actions 中设置 Dockerfile ARG 的相关文章

随机推荐

  • 像在 Java 中一样在 Swift 中使用套接字

    如果我想连接到服务器 在 Java 中我会打开一个 Socket 并使用端口和主机地址对其进行初始化 然后检索输入 输出流并读 写我想要的任何内容 在 Swift 中 我很难这样做 因为它不是那样构建的 我真的很想看到一个简单的示例 说明如
  • dlopen 失败:无法打开共享对象文件:没有这样的文件或目录

    问题是我使用dlopen加载一个库 so是我写的 它不是系统库 但我得到了标题中所示的错误 我已经包括了dlfcn h 在编译器中 我使用了 ldl command 我想要加载的只是源代码文件夹 我尝试添加 L 但没有成功 找出代码出错位置
  • R:通过引用函数传递 data.frame

    我通过一个data frame作为想要更改内部数据的函数的参数 x lt data frame value c 1 2 3 4 f lt function d for i in 1 nrow d if d value i 2 0 d val
  • 如何知道用户点击了“X”或“关闭”按钮?

    在MSDN中我发现CloseReason UserClosing知道用户已决定关闭表单 但我想单击 X 按钮或单击关闭按钮是相同的 那么我如何在代码中区分这两者呢 谢谢大家 假设您需要 WinForms 您可以使用FormClosing 事
  • 在 emacs python shell 中重新加载更改的 python 文件

    在 emacs Python shell 我正在运行 2 Python 中 我正在导入一个正在使用的 py 文件并测试代码 但是 如果我更改代码 我不知道如何再次导入它 从我到目前为止的阅读看来 reload modulename 应该有效
  • 在 AsyncTask 中获取上下文

    我正在尝试获取名为 Opciones 的类的 AsyncTask 中的上下文 该类是唯一调用该任务的类 但我不知道该怎么做 我看到了一些如下代码 protected void onPostExecute Long result Toast
  • 如何指定 FCM 消息的优先级?

    我正在使用 React native firebase 来管理 React native 应用程序上的通知 当应用程序关闭时 我尝试在后台处理 FCM 消息而不显示通知 我正在使用 React native firebase 来管理 Rea
  • 按编号搜索并使用 ABAddressBook 获取图像

    我希望使用号码作为键通过我的应用程序在 iphone 地址簿中进行搜索 然后检索与该联系人关联的图像并将其显示在 UIImageView 上 我尝试使用 ABAddressBook 框架 但无法继续 任何人都可以建议我解决方案或我可以遵循的
  • 绝对导入会导致 ModuleNotFoundError

    Python 3 6 我已经编写了一些组件 并且正在尝试将其中一个组件导入另一个组件中 下面是我的项目结构 components init py extract python3 init py extract py transform py
  • Laravel 5.2 中 auth()->user() 为 null

    我刚刚将 Composer 更新到 Laravel 5 2 无法查看受密码保护的页面 基本上下面的代码行不起作用 auth gt user 有人可以建议为什么这不起作用吗 确保任何需要会话 Auth 使用的 的路由都位于 web 中间件组
  • 使用应用内购买来解锁功能与使用 iPhone 的免费和付费应用版本

    我有一个应用程序 我打算将其作为具有部分全部功能的免费 精简版 版本和具有高级功能的付费完整版本发布 现在 通过在应用程序内购买免费应用程序 我正在考虑走这条路 能够根据需要解锁功能 我不是在谈论过期的试用版 基本上 我希望人们能够试用该应
  • 创建未知类型的数组

    我有一个对象 我必须验证该问题的值 对象的一些属性是自定义对象的数组 这样它将涉及到对数组的各个元素进行一些深入研究 为每个元素执行 getter 例如 AttribGrp x Object getAttribGrp x i getSome
  • 在.net中加载dll而不锁定它

    我正在执行一项任务 其中我必须加载 dll 并从中获取一些信息 例如类名等 但是当我将该 dll 加载到我的代码中时 它被锁定并且无法从源代码构建 直到我关闭加载程序 我尝试了某些解决方案 但没有一个适合我 Shadowcopy 在这种情况
  • 如何在 AngularJS 中动态更改 CSS 属性

    现在我有一个背景图像 URL 硬编码到 CSS 中 我想使用 AngularJS 中的逻辑动态选择背景图像 这是我目前拥有的 HTML div class offer detail image div div CSS offer detai
  • IPython Notebook 错误:加载笔记本时出错

    在过去的几分钟内 我无法访问任何 ipynb以前用Python3 4创建的文件 我进入包含这些文件的子目录 输入 ipython3 notebook 当我打开 新 笔记本时 出现以下错误 Unexpected error while sav
  • 服务层中的授权和用户信息(.NET 应用程序)

    我目前正在 NET 环境 n 层 中使用企业应用程序 我想知道在我的 BusinessLayer BL 中管理身份验证 授权 数据过滤的最佳方法 我们将从多个接口 ASP NET 应用程序和 Web 服务 使用该 BL 我认为我的 Serv
  • 如何使用 MouseListener 查找网格中的特定单元格

    我正在尝试创建一个由单元格组成的 10 x 10 网格的 Java 游戏 网格看起来像这样 public class Grid extends JPanel implements MouseListener public static fi
  • PHP:在mysql中的时间戳值内分割日期和时间

    我在数据库表中有一个名为 时间戳 的字段 它以以下格式存储值 YYYY MM DD HH MM SS 我想分开 然后获取变量中的日期 YYYY MM DD 以及另一个变量中的时间 HH MM SS 例子 timestamp 2012 10
  • 跨内存管理器边界传递 Delphi const 字符串参数是否安全?

    主题 我想使用字符串而不是 PChar 因为这样可以省去很多转换 但如果我这样做 procedure SomeExternalProc s string external SOMEDLL DLL 然后使用非共享内存管理器在其他一些项目中实现
  • 如何在 Github actions 中设置 Dockerfile ARG

    我有一个适用于我的 Node js 服务之一的 Dockerfile 我尝试使用 Github 操作将其推送到我的 Digitalocean 注册表 我的 Node js 服务需要一个由我自己在 npm js 注册表上托管的私有包 在我的