尝试使构建自动化更多,将构建移至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
答案 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 docker和Docker 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
和相关文件,因为如果主机和容器是不同的操作系统,节点版本等,它们将不起作用。