尝试从 docker 容器中安装使用(私有)git 存储库的包失败
Trying to install packages which use (a private) git repository from inside a docker container fails
在我们的设置中,我们有一个自动构建系统。构建实际上是在 docker 中完成的(因此 host 服务器不必安装所有库)。安装应该 使用 host os' 用户的凭据。
当我不使用 docker 图像并手动调用 npm i --only=production
时,系统工作。或者当我删除对 private git repositories 的任何依赖时它会起作用。但是,当我同时使用两者时,我会收到“警告”/错误。我首先收到“问题”,即 host 不在已知的 host 列表中(我知道这是针对我测试它的本地机器的)。后面报错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.pub
和 known_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
而不是 link 时,调试消息更改为:
debug1: identity file /root/.ssh/id_rsa type -1
检查主目录是如何 linked 运行ning:
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 密钥之类的?如果它已经找到一个它会强制使用本地密钥?
首先在您的 Docker 文件中添加一行:
ENV GIT_SSH_COMMAND='ssh -Tvv'
然后您将查看是否有错误消息或 Docker 从何处获取其 SSH 密钥:这有助于了解正在发生的事情。
好的,这是在@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
丑陋,但有效。
在我们的设置中,我们有一个自动构建系统。构建实际上是在 docker 中完成的(因此 host 服务器不必安装所有库)。安装应该 使用 host os' 用户的凭据。
当我不使用 docker 图像并手动调用 npm i --only=production
时,系统工作。或者当我删除对 private git repositories 的任何依赖时它会起作用。但是,当我同时使用两者时,我会收到“警告”/错误。我首先收到“问题”,即 host 不在已知的 host 列表中(我知道这是针对我测试它的本地机器的)。后面报错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.pub
和 known_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
而不是 link 时,调试消息更改为:
debug1: identity file /root/.ssh/id_rsa type -1
检查主目录是如何 linked 运行ning:
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 密钥之类的?如果它已经找到一个它会强制使用本地密钥?
首先在您的 Docker 文件中添加一行:
ENV GIT_SSH_COMMAND='ssh -Tvv'
然后您将查看是否有错误消息或 Docker 从何处获取其 SSH 密钥:这有助于了解正在发生的事情。
好的,这是在@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
丑陋,但有效。