在远程Docker容器中访问Github(启用2FA)

3

我没有找到其他类似的问题,但如果有涵盖以下所有元素的问题,请告诉我(远程访问主机、在其中设置Docker容器、使用Github 2FA访问私人存储库)。

最近我加入了一家公司,我从家里的笔记本电脑远程ssh访问主机。在这些机器上,我的同事们每个人都设置了一个Docker容器,而我也是(第一次)。

话虽如此,我使用以下流程来实现(a)推送到我们公司的私有Github存储库(假设为https://github.com/my_company_name/my_company_repo),以及(b)从我们公司的私有Github存储库克隆和安装(假设为https://github.com/my_company_name/colleague_repo)。

对于(a),我首先进入Docker容器内的终端,然后进入存储库目录,从我的仓库中git fetch,然后(添加/提交等后)git push,此时我必须填写用户名和密码。密码不能用在这里;我必须填写我的个人访问令牌(我创建了具有读取和写入权限的令牌)。

对于(b),我首先从同事的存储库git clone,然后必须输入用户名和密码。(同样,需要个人访问令牌代替密码。)然后我通过pip install -e按名称安装存储库。

我想通过在我的Dockerfile中使用适当的配置来避免不断提供我的凭据。(因此对于(a),我只想弹出我的终端并git push <origin> <master>就可以了。)我还想在Dockerfile本身中克隆和安装我的同事的存储库(即在Docker构建中执行所有克隆和安装操作),因为每次都有一组非常特定的公司存储库要安装--但是如您所见,认证无法工作。

我尝试添加以下行:

RUN git config --global user.name <my_username>
RUN git config --global user.password <personal_access_token>
RUN pip install -e git+https://github.com/my_company_name/colleague_repo

我已经将我的密码添加到 Dockerfile 中(也尝试在第二行中使用实际密码)。但没有成功 -- 收到了身份验证失败的消息。

有人能帮忙吗?


1
user.password 不是git配置键。你尝试过 https://<user>:<password>@github.com/blah_blah 吗? - iBug
请注意,您需要使用PAT而不是密码。无论如何,您也可以使用SSH进行身份验证。 - dan1st
@iBug,请详细说明:我在Dockerfile中尝试将其放置在哪里?如果在安装中,如何帮助我处理推送?<password>是指PAT吗?这不会使得Dockerfile在主机上公开(对我的同事)有所顾虑吗? - Mobeus Zoom
@dan1st 如果您想要发布一篇回答,展示如何使用Docker文件配置,并保持SSH密钥私密(如果需要在公司机器上?),我会很感激。我相信有一些方法,像是libsecret可以将Git凭证保密(例如,https://www.softwaredeveloper.blog/git-credential-storage-libsecret with HTTPS authentication),但我不确定如何将其放入我的Dockerfile中。 - Mobeus Zoom
你需要制作一个宏,因为你无法安全地存储任何东西。在这种情况下,SSH密钥也无法帮助你。 - dan1st
显示剩余5条评论
1个回答

1

您可以使用SSH密钥,并采用多阶段方法,如Vladislav Supalov所述的“在不留下SSH密钥的情况下从Dockerfile访问私有存储库”。

# this is our first build stage, it will not persist in the final image
FROM ubuntu as intermediate

# install git
RUN apt-get update
RUN apt-get install -y git

# add credentials on build
ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa

# make sure your domain is accepted
RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

RUN git clone git@bitbucket.org:your-user/your-repo.git

FROM ubuntu
# copy the repository form the previous image
COPY --from=intermediate /your-repo /srv/your-repo
# ... actually use the repo :)

更现代的方法是通过 使用BuildKit
使用新的SSH挂载类型,您可以让Docker构建程序使用主机的SSH密钥。

Here’s how it looks like:

RUN --mount=type=ssh ...

You add the new mount type to your RUN command, and the whole process is taken care of for you.

请查看 BuildKit / Dockerfile 前端语法 / RUN --mount=type=ssh


1
感谢您。然而,教程中似乎缺少一些细节。使用中间构建的SSH方法:
  1. 我应该如何修改RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hostsRUN git clone git@bitbucket.org:your-user/your-repo.git以适应我的目的?(访问Github)
  2. COPY --from=intermediate /your-repo /srv/your-repo后面跟着什么?是我当前的Dockerfile吗?如果是这样,在什么阶段以及如何删除中间镜像?
- Mobeus Zoom
1
使用BuildKit,对于像我这样的初学者来说,真的没有太多可以借鉴的。例如,mkdir -p -m 0700 ~/.ssh中发生了什么?或者在指定挂载类型后,ssh -q -T git@gitlab.com 2>&1 | tee /hello中发生了什么?2. 我如何修改此内容以访问Github(而不是Gitlab),特别是如果我没有apk因为我不使用alpine(而是python3)?如果您能提供一个符合我在OP中设定的条件的示例,那将是非常棒的。 - Mobeus Zoom
1
那么我应该运行什么构建命令?它需要有--squash吗?我是使用两次docker build还是只用一次?我有点困惑。 - Mobeus Zoom
@MobeusZoom 一个正常的Docker构建(用于多阶段方法)。不需要压缩。 - VonC
好的,谢谢。如果您认为使用BuildKit方法有任何优势,我很乐意听取一些澄清/详细信息。 - Mobeus Zoom
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接