当在synology dsm中运行时,从docker中安装npm失败,但在本地工作



在尝试更多地自动化构建时,构建被移到了docker中——然而,虽然这在我们的本地设置中有效,但在远程服务器中却不行。

构建过程的dockerfile如下所示;

FROM node:14-alpine
RUN apk update
RUN apk upgrade
RUN apk add rsync
RUN apk add git less openssh
RUN mkdir /javascript
WORKDIR /javascript
RUN npm install flow-remove-types -g
ENTRYPOINT npm ci

在构建之后,它被调用通过:

sudo docker run -it --volume=/home/paul/project/javascript:/javascript 
--volume=/home/paul/.ssh:/home/node/.ssh 
--volume=/home/paul/.ssh:/root/.ssh 
--volume=/home/paul/.npm:/home/node/.npm 
--entrypoint "sh" buildimagedocker

(出于测试目的更改入口点(。

如果我随后开始并键入";npm安装";或";npm-ci";我得到以下错误:

npm ERR! Error while executing:
npm ERR! /usr/bin/git ls-remote -h -t ssh://git@<GITSERVER>
npm ERR! 
npm ERR! No user exists for uid 1028
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.
npm ERR! 
npm ERR! exited with error code: 128
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-09-25T15_18_53_397Z-debug.log

然而,从git手动克隆工作得很好,所以这一定是npm安装的问题。

此外,同一个docker在我的本地pc上运行得很好,只是在synology dsm中出现了问题。

我在这里看到了同样的问题报告。然而在那里它被表示为";固定的";已经我测试了当前的npm版本:

npm——版本:6.14.8

那么出了什么问题,我该如何解决呢?

EDIT,最大的区别是在我的本地电脑上,文件权限看起来像:

drwxr-xr-x    2 node     node          4096 Sep 25 13:45 bin
drwxr-xr-x   10 node     node          4096 Sep 25 13:45 build
drwxr-xr-x    2 node     node          4096 Sep 25 13:45 config

在远程时,它看起来像:

drwxr-xr-x    2 1028     users         4096 Sep 25 15:18 bin
drwxr-xr-x    2 1028     users         4096 Sep 25 15:18 build
drwxr-xr-x    2 1028     users         4096 Sep 25 15:18 config

在docker之外,相同的文件看起来像(本地(:

drwxr-xr-x  2 paul paul   4096 sep 25 15:45 bin
drwxr-xr-x 10 paul paul   4096 sep 25 15:45 build
drwxr-xr-x  2 paul paul   4096 sep 25 15:45 config

远程:

drwxrwxrwx+   2 PaulWeijtens users   4096 Sep 25 17:18 bin
drwxrwxrwx+   2 PaulWeijtens users   4096 Sep 25 17:18 build
drwxrwxrwx+   2 PaulWeijtens users   4096 Sep 25 17:18 config

这确实是一个权限问题,但并没有像doublesharp的答案所解释的那样得到解决。我通过重构文件的工作方式来修复它。在这个答案中,我将试图解释我是如何以及为什么做这些事情的(为了未来的denvercoder9(。我可能不完全正确,请在评论中纠正我,或者更新答案(我刚刚开始"明白"这个(。

/home/node/.ssh/root/.ssh下的文件不属于正在运行的当前用户。通常这不是问题,因为程序被读取为"0";根";从码头内部。

虽然主进程确实在alpine:nodedocker中以root身份运行,但npm运行的任何操作似乎都会将权限降级到node用户。由于这个原因,以用户1028的身份运行docker不起作用,文件仍然被访问,就像它是用户node一样。

因此,解决方案是更改文件权限,但由于在卷中这样做也会更改主机上的权限,因此我选择重构docker,并使用Dockerfile将文件复制到docker中。

COPY local/ssh/ /root/.ssh/
COPY local/ssh/ /home/node/.ssh/

然而,这意味着该文件有777作为权限掩码,ssh(相当激烈地(抱怨它不接受其他人可读的文件。然而,运行chmod将掩码更改为400再次出现权限问题,因为npm不是作为root运行的,或者是创建docker的同一用户,所以在运行过程中无法访问文件。因此,目录所有权必须更改为用户node

最后,由于在远程计算机上,主目录位于与本地计算机不同的位置,我选择不使用主目录作为ssh位置。而是使用本地ssh目录。

生成的dockerfile现在看起来像:

FROM node:14-alpine
RUN apk update
RUN apk upgrade
RUN mkdir /javascript
WORKDIR /javascript

RUN npm install flow-remove-types -g
COPY --chown=node:node local/ssh/ /root/.ssh/
COPY --chown=node:node local/ssh/ /home/node/.ssh/
RUN chmod 400 /root/.ssh/id_rsa
RUN chmod 400 /home/node/.ssh/id_rsa
ENTRYPOINT chown -R node:node . && npm ci

和一样的呼叫

sudo docker run -it --volume=/home/paul/project/javascript:/javascript 
--volume=/home/paul/.npm:/home/node/.npm 
--entrypoint "sh" buildimagedocker

需要注意的重要一点是,alpine:nodedocker将运行npm进程,而不是使用node,而不是root。更改docker的用户id对此没有任何影响。

您正试图安装到一个已装入的卷,该卷在主机上的权限设置为用户ID1028,但容器中不存在,因此无法写入该卷。要修复此问题,您可以将卷上的权限设置为更开放,在容器内创建具有相同ID的用户,或者使用-u参数启动容器以指定UID。

有关使用docker的GID/UID的更多信息,请参阅最后一行和本文,以及针对USER的docker文档的这一部分。

sudo d

ocker run -it --volume=/home/paul/project/javascript:/javascript 
--volume=/home/paul/.ssh:/home/node/.ssh 
--volume=/home/paul/.ssh:/root/.ssh 
--volume=/home/paul/.npm:/home/node/.npm 
--entrypoint "sh" buildimagedocker 
-u 1028:1028 

通常也不建议与容器共享node_modules和相关文件,因为如果主机和容器是不同的操作系统、节点版本等,它们将不起作用。

最新更新