【问题标题】:Trying to install packages which use (a private) git repository from inside a docker container fails尝试从 docker 容器内安装使用(私有)git 存储库的软件包失败
【发布时间】:2020-08-30 00:08:37
【问题描述】:

在我们的设置中,我们有一个自动构建系统。构建实际上是在 docker 内完成的(因此主机服务器不必安装所有库)。安装应该使用主机操作系统用户的凭据。

当我不使用 docker 映像并手动调用 npm i --only=production 时,系统可以正常工作。或者,当我删除对私有 git 存储库的任何依赖时,它会起作用。但是,当我同时使用两者时,我会收到“警告”/错误。我首先收到主机不在已知主机列表中的“问题”(我知道这是针对我测试它的本地机器)。随后出现错误git@HOST: Permission denied (publickey).

docker文件如下:

FROM node:12-alpine
RUN apk update
RUN apk upgrade
RUN apk add rsync
RUN apk add git less openssh

RUN mkdir /javascript
WORKDIR /javascript

ENTRYPOINT npm i --only=production

docker 使用这些参数运行:

sudo docker run -it --volume=/home/paul/PROJECTDIR/javascript:/javascript --volume=/home/paul/.ssh/:/root/.ssh/ IMAGEID

package.json 的豁免(实际上是违规行):

"dependencies": {
  "configuration-loader": "git+ssh://git@HOST",
}

我可以很容易地从 docker 外部执行 npm i --only=production,它一定是 docker 没有正确读取 ssh 信息吗?我仔细检查了,但 /home/paul/.ssh 包含正确的 id_rsa id_rsa.pubknown_hosts 文件。

那么这里发生了什么?为什么从 docker 安装没有读取 ssh 信息?我是否绑定了错误的内部位置? - 我应该使用什么位置?

我还尝试将入口点更改为 sh,然后检查 ~/.ssh 中的内容(并且该目录存在) - 这显示的键非常好。


为了调试,我将入口点更改为sh 并手动尝试安装(同样的错误),但使用printenv 显示:

GIT_SSH_COMMAND=ssh -Tvv
NODE_VERSION=12.18.3
HOSTNAME=3dd43e45c090
YARN_VERSION=1.22.4
SHLVL=2
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/javascript

此外,使用ENV GIT_SSH_COMMAND ssh -Tvv 报告的消息如下:

debug1: identity file /home/node/.ssh/id_rsa type -1

当我将音量更改为不链接到 /root 内而是链接到 /home/node 时,调试消息变为:

debug1: identity file /root/.ssh/id_rsa type -1

检查主目录如何链接运行:

ls -alrth /home

显示(将卷绑定到 /root 时):

drwxr-xr-x    1 root     root        4.0K Jul 28 21:24 .
drwxr-sr-x    1 node     node        4.0K Aug 31 09:07 node
drwxr-xr-x    1 root     root        4.0K Aug 31 09:07 ..

当绑定到/home/node 时,会出现相同的条目,只是node.. 之后(虽然报告的时间相同,所以一定是侥幸)。

它似乎实际上强制执行一个新的 ssh 密钥或什么?如果它已经找到一个它会强制执行本地密钥?

【问题讨论】:

  • /home/node 是符号链接吗? ls -alrth /home 在两种情况下都返回什么?
  • @VonC 他们是“平等的”。

标签: git docker ssh npm-install


【解决方案1】:

好的,这得到了@VonC 的大力帮助,也是迄今为止我最不喜欢的解决方案。但我的解决方法是将/home/home/node 绑定到外部主目录。

sudo docker run -it \
    --volume=/home/paul/PROJECTDIR/javascript:/javascript \
    --volume=/home/paul/.ssh/:/root/.ssh/ \
    --volume=/home/paul/.ssh/:/home/node/.ssh IMAGEID

丑陋,但工作。

【讨论】:

    【解决方案2】:

    首先在 Dockerfile 中添加一行:

    ENV GIT_SSH_COMMAND='ssh -Tvv'
    

    然后您将查看是否有错误消息或 Docker 从何处获取其 SSH 密钥:这有助于了解发生了什么。

    【讨论】:

    • 我注意到它说了很多调试:debug1: identity file /home/node/.ssh/id_rsa type -1 - 这是否意味着它将/home/node/.ssh/ 视为目录? - 为什么?我不明白为什么它会在用户个人资料上考虑这一点?
    • @paul23 可能是因为$HOME是在npm执行的上下文中重新定义的?
    • 更奇怪的是,如果我将音量更改为指向 /home/node 而不是 root,则会出现相同的调试错误,但现在 debug1: identity file /root/.ssh/id_rsa type
    • @paul23 您应该尝试调用一个脚本(而不是直接在您的npm 中使用ENTRYPOINT),该脚本将首先使用命令env 显示环境变量,然后调用@987654330 @。这会给你更多的线索。
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2019-06-26
    • 2023-03-16
    • 2016-11-15
    • 2023-01-26
    相关资源
    最近更新 更多