使用Docker容器非root用户克隆GitHub私有存储库?

时间:2017-01-25 17:06:43

标签: git docker ssh npm

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

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

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

由于我们的GitHub存储库是私有存储库,因此我设置了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命令之前导出这些变量。

然而,当我们尝试从容器中启动install命令时:

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连接问题:

  

uid 1000

没有用户

相关吗?我不确定。

一种解决方案可能是在启动命令之前创建具有主机UID的虚拟用户。但是,我该如何创造呢?我在构建期间不能这样做(因为我无法访问UID环境变量),如果我在执行命令时尝试,我得到了:

docker-compose run --rm --no-deps node bash -ci "sudo"
sudo: unknown uid 1000: who are you?

或者还有其他解决方案吗?

1 个答案:

答案 0 :(得分:4)

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

首先,我不使用我的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与主机系统相同。然后,我们添加一些虚拟所拥有的必需文件夹。然后我们添加一个.ssh/config文件以防止GitHub主机检查,这会导致npm失败。其内容是:

Host github.com
    StrictHostKeyChecking no

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