我正在尝试通过 GitHub 安装私有(private)存储库 npm 包:

npm install --save-dev MyCompany/MyRepository#my-branch 

它在我的主机系统上运行良好。但是,我们使用 docker-compose编排我们所有的 Docker 容器,尤其是我们的 node一。

由于我们的 GitHub 存储库是私有(private)存储库,我将 SSH 代理转发设置如下(简化) docker-compose.yml片段显示:
version: '2' 
 
services: 
    node: 
        build: docker/node 
        environment: 
            - SSH_AUTH_SOCK=/ssh-agent 
        volumes: 
            - $SSH_AUTH_SOCK:/ssh-agent 
        user: "${UID}:${GID}" 

我们使用主机 UID 和 GID 来防止文件权限出现一些问题。这些变量在启动 docker-compose run 之前被导出。命令。

然而,当我们尝试从容器启动安装命令时:
docker-compose run --rm --no-deps node bash -ci 'npm install' 

我们遇到了连接问题 ( Error connecting to repository. Please, check the url.)。

然后我们直接测试了一个 SSH 连接:
docker-compose run --rm --no-deps node bash -ci 'ssh -T git@github.com' 

现在我们遇到了 SSH 连接的问题:

No user exists for uid 1000



有关系吗?我不知道。

一种解决方案可能是在启动命令之前创建一个具有主机 UID 的虚拟用户。然而,我怎样才能创造它?在构建期间我不能这样做(因为我无权访问 UID 环境变量),如果我在执行命令时尝试,我得到:
docker-compose run --rm --no-deps node bash -ci "sudo" 
sudo: unknown uid 1000: who are you? 

或者有没有其他解决方案?

请您参考如下方法:

我终于成功地让它工作了。这远非易事,但这是解决方案。

首先,我不使用我的 docker-compose 容器,而是根据我的图像运行一个新容器。我保留了 SSH 代理共享:

USER_ID=$(id -u) 
docker run --rm -it \ 
    -v `pwd`:/app \ 
    -v $(SSH_AUTH_SOCK):/ssh_agent \ 
    -e SSH_AUTH_SOCK=/ssh_agent \ 
    -e USER_ID=$USER_ID \ 
    my_project_node bash -ci "/app/bin/yarn.sh" 

请注意,我保留了 SSH 代理共享( SSH_AUTH_SOCK 部分)并添加了一个带有主机用户 UUID 的环境变量,因为我们需要它来在容器中创建我们的虚拟用户,以保持正确的文件权限。
/app/bin/yarn.sh文件如下:
#!/bin/bash 
 
useradd -u $USER_ID dummy 
mkdir -p /home/dummy/.ssh /home/dummy/.npm 
chown -R dummy /home/dummy 
cat /app/docker/node/.ssh_config > /home/dummy/.ssh/config 
su dummy -c 'npm install' 

这里的技巧是创建一个与主机系统具有相同 UUID 的虚拟用户。然后,我们添加一些 dummy 拥有的必需文件夹。然后我们添加一个 .ssh/config文件以防止 GitHub 主机检查,这会导致 npm 失败。它的内容是:
Host github.com 
    StrictHostKeyChecking no 

这个解决方案远非微不足道,我很好奇其他开发人员是否有更好的解决方案。 :)


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!