【问题标题】:How do I enable ssh access within a Docker container without copying my keys?如何在不复制密钥的情况下在 Docker 容器中启用 ssh 访问?
【发布时间】:2015-01-07 06:10:26
【问题描述】:

我想构建一个 Docker 容器,从私有 GitHub 存储库下载一些东西(在构建时!)。这意味着我需要提供 SSH 密钥,但我不想将它们复制到容器中,因为这样每个有权访问容器的人都可以使用它们。

我该如何解决这个问题?

基本上,我正在寻找诸如 SSH 代理转发之类的东西,但不是在容器运行时,而是在容器构建时。

有什么提示吗?

【问题讨论】:

  • 为什么不做一个首先下载文件的 shell 脚本,然后使用 Dockerfile 调用 docker build 来添加之前下载的文件?

标签: git ssh docker ssh-keys


【解决方案1】:

一种简单而安全的方法是从 git 下载到您的主机,然后将下载的文件从您的主机复制到您的容器。不需要钥匙。

获取短容器id:

docker ps

获取完整的容器id:

docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID

复制文件(在主机中):

sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE

【讨论】:

  • 这对我不起作用,因为主机是 OS X,而且我有一些模块需要编译(OS X 二进制!== Linux 二进制)。
  • 将它们提取到您的主机,然后在 Dockerfile 中构建它们。 docker build 会将构建上下文上传到服务器。你使用 Makefile 吗?这可以像在目录中运行 make 以执行 git clone $(URL) ./build/dep1docker build . 一样简单。
【解决方案2】:

推荐的方法是将 Dockerfile 添加到 repo 的根目录。在您的工作站上克隆 repo,然后执行“docker build”,将当前目录(构建上下文)发送到 docker 守护进程。

通常几乎不需要在 Dockerfile(在服务器上)克隆私有存储库。

【讨论】:

  • “通常几乎不需要在 Dockerfile 中(在服务器上)克隆私有存储库。” ......我很抱歉,但这完全是错误的。
  • 请考虑一下,如果我错了,您的问题现在应该已经被大声回答了。有一种方法可以做您正在做的事情,而您尝试做的事情却不是。
  • 我不想在这里开始争论,但是您如何处理私有 npm 包,例如?既不能将它们安装在主机上(错误的操作系统),也不能将它们添加到源代码控制中(这违反了 Node.js 的最佳实践)。同样的问题基本上适用于通常使用包管理器安装的任何私有工件。顺便说一句:还没有答案的事实也可能意味着没有好的答案可用。这并不一定意味着我正在尝试做的事情是错误的。
  • 在主机上将它们提取到 dockerfile 工作目录中。然后在主机上构建,将它们作为构建上下文的一部分上传。你的凭据永远不会离开你的机器,它仍然像往常一样构建在 dockerd 主机上。
  • 你不能同时拥有它;您可以将凭据放入构建容器中以便它可以获取它们(您说您不想要这个,但docker build --build-arg 是可能的),或者您将凭据保存在本地计算机上并上传克隆/下载的代码到容器(更安全)。你必须选择一个。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 2013-08-10
  • 2015-12-15
  • 2016-04-16
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多