【问题标题】:Cloning GitHub private repository with Docker container non-root user?使用 Docker 容器非 root 用户克隆 GitHub 私有存储库?
【发布时间】:2017-06-10 23:31:04
【问题描述】:

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

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

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

由于我们的 GitHub 存储库是私有的,我将 SSH 代理转发设置如下(简化)docker-compose.ymlsn-p 显示:

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

uid 1000 不存在用户

有关系吗?我不知道。

一种解决方案可能是在启动命令之前创建一个具有主机 UID 的虚拟用户。然而,我怎样才能创造它?我无法在构建期间执行此操作(因为我无权访问 UID 环境变量),如果我在执行命令时尝试,我得到:

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

或者有其他解决方案吗?

【问题讨论】:

  • “我们正在使用主机 UID 和 GID 来防止文件权限出现一些问题”你能举个例子吗?
  • 没有user: "${UID}:${GID}" 行的行为如何?
  • 请注意,我写了一篇博文详细介绍了这个${UID}:${GID} 部分以及我找到的解决方案:jonathan-petitcolas.com/2017/01/26/…

标签: git docker ssh npm


【解决方案1】:

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

首先,我不使用我的 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

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

【讨论】:

  • 我有一个更大的功能来完成繁重的工作,这不是一个完整的答案,但超出了这个评论的范围。检查一下github.com/tianon/gosu/issues/40#issuecomment-336324805,看看是否有什么可以改善你的答案。还与同样在 Docker 上工作的 gosu 的维护者进行了一些讨论,因此提供了一些很好的提示和技巧。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2021-09-04
  • 2022-08-08
  • 2021-09-16
  • 1970-01-01
  • 2021-11-18
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多