【发布时间】:2019-11-06 09:55:06
【问题描述】:
我在 Azure DevOps 上为 React 应用程序构建了一些 Docker,其中包括来自私有 npm 源的包,这些包也托管在 Azure DevOps 上。最近,npm install 命令的构建开始失败。
为了验证要从私人提要安装的容器,我一直使用.npmrc 文件。这在本地保存为.npmrc.docker,如下所示:
@<package-scope>:registry=https://<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/registry/
//<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/registry/:username=<feed-name>
//<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/registry/:_password=${NPM_TOKEN}
//<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/registry/:email=npm requires email to be set but doesn't use the value
//<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/:username=<feed-name>
//<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/:_password=${NPM_TOKEN}
//<devops-username>.pkgs.visualstudio.com/_packaging/<feed-name>/npm/:email=npm requires email to be set but doesn't use the value
我在顶部定义了一个作用域包源,其余部分是通过 Azure DevOps 的 Connect to feed 向导生成的。 ${NPM_TOKEN} 是我的提要密码,我将它作为构建参数传递给 docker build 命令。
我的 Dockerfile 中使用它的部分如下所示:
FROM node:alpine as build
ARG NPM_TOKEN
COPY ./.npmrc.docker /app/.npmrc
COPY ./package.json /app/package.json
WORKDIR /app
RUN npm install
RUN rm -f .npmrc
在我的 Azure DevOps 构建管道中,这一直有效。管道的 构建图像 部分从像这样的变量 - --build-arg NPM_TOKEN=$(ArtifactsNpmPat) - 其中 ArtifactsNpmPat 是我的库中的一个变量,在此构建 arg 中提供数据。
最近我的构建开始失败。最初我认为我的令牌已经过期,所以我生成并存储了一个新令牌。这是代理的错误:
[错误]命令'/bin/sh -c npm install'返回一个非零代码:1
[错误]进程“/usr/bin/docker”失败,退出代码为 1
请注意,相同的过程继续在本地工作。所以我不知道如何诊断。我确实找到了this SO post,这导致我将 Dockerfile 更新为如下所示:
FROM node:alpine as build
ARG NPM_TOKEN
COPY ./.npmrc.docker /app/.npmrc
COPY ./package.json /app/package.json
WORKDIR /app
RUN npm install -g vsts-npm-auth
RUN vsts-npm-auth -config .npmrc
RUN npm install
RUN rm -f .npmrc
但是,docker build 现在会从 RUN vsts-npm-auth 命令生成一个非常疯狂的错误。
/usr/local/bin/vsts-npm-auth: line 1: MZ�╚╝���@���: not found
/usr/local/bin/vsts-npm-auth: line 1: �ԞO���: not found
/usr/local/bin/vsts-npm-auth: line 57: ╔╚��║[�
╔0�
&� �@ ╗╝═�╗��╔╚.rsrc�@@.reloc
�╗�@�H╗║�?�Y
╗*═d��╚���╗(&
╗╚s'
}║╝╗╗╚═}═╝*╗{═╝*0╗4╔╗╚( ═╔╗╚(
═╔╚╚(
═╔╗╚(
═╔╗╚(
+═*0╔╗╚/(═
+═*0╝M╗╗{║╝o(
═()
�╔
,+╚═o*
�╔ ,s+
z═o,
Xo-
╝+║╚╝+╝*0╔╗╚?(═
+═*0╔╗╚#(═
+═*0A╚╚r╔po.
-╗{║╝o/
r╔p(0
+╔
═,║╚
+╗╚/(═
+*0╝�╝╗╚╝║(═
═�╔ ,&═╝╝,r║p╝�S╔╚(1
s2
z╚║+Z╚═o3
╚╚o,
═X(4
o5
╝-╚+║rgp║-╗(6
%-═&rgp+║rgp╝-rgp+(7
║+║*0╗║║- ╚╝o8
+╚╝o9
+═*0╚L╗(&
╗╚}
╝╗║}╝╗═}╝╗╗(═}╝*╝═
╗{╝o:
╗(╗{
╝s;
╗(═o
╝+#╝o
║╗ ║(═══�╚,╗
╝o
╝╝o
0�s<╔╗30c
╗{╝ripo=
�╚,E(>
r�p�╔%rip�%�(?
�S╔%;�o@
═ sA
oB
═╚╗{╝sC
oB
═sD
╝+╝*0║╗{╝-rp╔p+║r�╔p
╝═╗{╝oE
+*0╗# ╗{
╝%-
&╗{╝(═: not found
/usr/local/bin/vsts-npm-auth: line 58: syntax error: unexpected word (expecting ")")
所以我被困住了。 DevOps 在使用其私有提要进行身份验证方面是否发生了变化?不是我知道的,但就像我说的那样,这些构建在 10 月份的某个时候停止工作,而我没有进行任何更改。建议表示赞赏。
【问题讨论】:
-
身份验证令牌已过期?
-
就像我上面说的,“我认为我的令牌已经过期,所以我生成并存储了一个新的”。我现在实际上已经做过几次了。除非 DevOps 在生成新令牌时存在一些错误。我从 Connect to feed / npm / Generate credentials 对话框中获取它。
-
现在token的格式已经改变了,会不会是因为将新格式的token放到.npmrc文件中不起作用?你可以考虑这个situation
-
嗨。感谢您的评论。我实际上不确定发生了什么。我决定尝试我在本地存储在环境变量中并在 DevOps 中工作的那个。然后我尝试在 DevOps 中生成一个新的并使用它,它也有效。我注意到我存储在我的 DevOps 库中的那个要短得多,所以我的理论是,当我从 DevOps 复制生成的密钥时,它被添加到我的剪贴板并带有换行符,所以只有第一部分被粘贴到我所在的文本框中存储它。但这只是一个猜测,也许我只是愚蠢。无论哪种方式,它现在都可以工作了:/
-
我遇到了完全相同的错误。事实证明,我试图在 linux docker 映像上运行 vsts-npm-auth。这仅适用于 Windows,可能适用于 WSL,但不适用于 linux。
标签: docker npm azure-devops