我有一个应用程序,执行各种有趣的东西与Git(像运行Git克隆& Git推送),我试图docker-ize它。

我遇到了一个问题,虽然我需要能够添加一个SSH密钥到容器的容器“用户”使用。

我试着把它复制到/root/。ssh/,更改$HOME,创建一个git ssh包装器,仍然没有运气。

以下是Dockerfile供参考:

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

App.js运行git命令,比如git pull


当前回答

在一个运行的docker容器中,你可以使用docker -i (interactive)选项发出ssh-keygen。这将转发容器提示,在docker容器中创建密钥。

其他回答

你可以通过共享文件夹将授权密钥传递到你的容器中,并使用docker文件设置权限,如下所示:

FROM ubuntu:16.04
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
EXPOSE 22
RUN cp /root/auth/id_rsa.pub /root/.ssh/authorized_keys
RUN rm -f /root/auth
RUN chmod 700 /root/.ssh
RUN chmod 400 /root/.ssh/authorized_keys
RUN chown root. /root/.ssh/authorized_keys
CMD /usr/sbin/sshd -D

您的docker运行包含如下内容,与容器共享主机上的认证目录(持有authorised_keys),然后打开ssh端口,该端口将通过主机上的端口7001访问。

-d -v /home/thatsme/dockerfiles/auth:/root/auth -–publish=127.0.0.1:7001:22

您可能想要查看https://github.com/jpetazzo/nsenter,它似乎是打开容器上的shell并在容器中执行命令的另一种方式。

以下是Docker容器中SSH所面临的挑战的简要概述。要从容器内连接到可信的远程而不泄漏机密,有以下几种方法:

SSH代理转发(只支持linux,不是直接的) 内置SSH,使用BuildKit(实验性,Compose还不支持) 使用绑定挂载来公开~/。SSH到容器。(仅限开发,潜在不安全) Docker Secrets(跨平台,增加复杂性)

除此之外,在使用Compose时,还可以使用在运行时可访问的独立docker容器中运行的密钥存储。这里的缺点是由于创建和管理密钥存储库(如HashiCorp的Vault)所需的机制而增加了复杂性。

对于在独立的Docker容器中使用SSH密钥,请参阅上面链接的方法,并根据您的具体需求考虑每种方法的缺点。然而,如果你在Compose中运行,并且想要在运行时共享一个应用程序的密钥(反映OP的实用性)试试这个:

创建一个docker-compose。Env文件并将其添加到.gitignore文件中。 更新docker-compose。Yml并为需要密钥的服务添加env_file。 在应用程序运行时从环境中访问公钥,例如process.node。Node.js应用中的DEPLOYER_RSA_PUBKEY。

上述方法非常适合开发和测试,虽然它可以满足生产需求,但在生产中,您最好使用上述其他方法之一。

额外的资源:

Docker文档:使用绑定挂载 Docker Docs:使用Docker机密管理敏感数据 堆栈溢出:在docker容器内使用SSH密钥 Stack Overflow:在macOS上使用ssh-agent和docker

最简单的方法是,获得一个发射台帐户并使用:ssh-import-id

正如eczajk已经在Daniel van Flymen的回答中评论的那样,删除键并使用-squash似乎不安全,因为它们仍然会在历史记录中可见(docker history -no-trunc)。

在Docker 18.09中,你可以使用“构建秘密”特性。在我的情况下,我克隆了一个私人git回购使用我的主机SSH密钥与以下在我的Dockerfile:

# syntax=docker/dockerfile:experimental

[...]

RUN --mount=type=ssh git clone [...]

[...]

为了能够使用这个,你需要在运行docker build之前启用新的BuildKit后端:

export DOCKER_BUILDKIT=1

你需要在docker build中添加——ssh default参数。

更多信息请点击:https://medium.com/@tonistiigi/build- secrets.and -ssh- foring-in dock-18-09-ae8161d066

不得不承认,这是一个迟到的派对,如何让你的主机操作系统密钥可以在容器内的根目录中运行:

docker run -v ~/.ssh:/mnt -it my_image /bin/bash -c "ln -s /mnt /root/.ssh; ssh user@10.20.30.40"

我不赞成使用Dockerfile来安装密钥,因为容器的迭代可能会留下私有密钥。