克隆与Docker容器非root用户的GitHub私人存储库?

我想通过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命令之前导出这些variables。

但是,当我们尝试从我们的容器启动安装命令时:

 docker-compose run --rm --no-deps node bash -ci 'npm install' 

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

然后我们直接testing一个SSH连接:

 docker-compose run --rm --no-deps node bash -ci 'ssh -T git@github.com' 

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

没有用户存在为uid 1000

它有关系吗? 我不确定。

一种解决scheme可能是在启动命令之前使用主机UID创build一个虚拟用户。 但是,我该如何创build它? 我不能在构build期间(因为我没有访问UID环境variables),如果我尝试执行命令时,我得到:

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

还是有其他解决scheme?

我终于成功地使它工作。 这很不容易,但这是解决scheme。

首先,我不使用我的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部分),并添加一个环境variables与主机用户UUID,因为我们需要它在容器中创build我们的虚拟用户,以保持正确的文件权限。

/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' 

这里的技巧是创build一个与主机系统相同的UUID的虚拟用户。 然后,我们添加一些虚拟所需的文件夹。 然后,我们添加一个.ssh/config文件,以防止从GitHub主机检查,导致npm失败。 其内容是:

 Host github.com StrictHostKeyChecking no 

这个解决scheme不是微不足道的,我很好奇其他开发者是否有更好的解决scheme。 🙂