在Synology DSM中运行时,从docker内部进行npm安装失败,但在本地工作

时间:2020-09-25 15:36:42

标签: node.js 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 install”或“ 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上才出现问题。

我看到了相同的问题报告here。但是,它已经被表示为“固定”。我测试了当前的npm版本:

npm --version:6.14.8

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

编辑,最大的不同是在我的本地PC中,文件权限如下:

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

2 个答案:

答案 0 :(得分:1)

这确实是一个权限问题,但并未如doublesharp的答案所解释。我通过重构文件的工作方式来修复它。在这个答案中,我将尝试解释我做这些事情的方式和原因(针对将来的denvercoder9s)。我可能不太正确,请在评论中纠正我,或者更新答案(我只是开始“了解”)。

正在运行的当前用户不拥有/home/node/.ssh/root/.ssh下的文件。通常,这不是问题,因为程序是从docker内部读取为“ root”的。

尽管主进程确实确实是在alpine:node泊坞窗中以root身份运行的,但是npm运行的任何内容似乎都会降低对node用户的权限。因此,以用户1028身份运行docker无法正常工作,仍然像用户node一样访问文件。

因此,解决方案是更改文件许可权,但是由于在卷中执行此操作还将更改主机许可权,因此我选择了重构docker并将文件 copy 重构到docker中使用Dockerfile

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

但是,这意味着该文件具有777作为权限掩码,并且ssh(非常激烈地)抱怨说它将不接受他人可读的文件。运行chmod将掩码挂起至400,但是再次出现权限问题,因为npm的运行方式不像root或创建docker的同一用户,在此期间无法访问文件运行。因此,目录所有权必须更改为用户node

最后,由于远程目录的主目录与本地PC所在的位置不同,因此我选择不将主目录用作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:node泊坞程序将运行npm进程,而不是使用node,而不是root。并且更改Docker的用户ID对此没有影响。

答案 1 :(得分:0)

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

有关指定GID/UID with dockerDocker documentation for USER本部分的更多信息,请参见最后一行以指定UID。

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和相关文件,因为如果主机和容器是不同的操作系统,节点版本等,它们将不起作用。