在Dockerfile中进行Subversion导出/签出,而不在屏幕上打印密码

我想编写一个Dockerfile,将远程Subversion版本库中的一个目录导出到构build上下文中,这样我就可以在后续的命令中使用这些文件。 存储库使用用户/密码authentication进行保护。

该Dockerfile可能是这样的:

# base image FROM ubuntu # install subversion client RUN apt-get -y update && apt-get install -y subversion # export my repository RUN svn export --username=myUserName --password=myPassword http://subversion.myserver.com/path/to/directory # further commands, eg on container start run a file just downloaded from the repository CMD ["/bin/bash", "path/to/file.sh"] 

但是,这有一个缺点,就是在屏幕上打印我的用户名和密码,或者输出stdout的任何日志文件,如Step 2 : RUN svn export --username=myUserName --password=myPassword http://subversion.myserver.com/path/to/directory 。 在我的情况下,这是一个Jenkins构build日志,也可以被其他不应该看到凭据的人访问。

在输出中隐藏用户名和密码的回显,最简单的方法是什么?

到目前为止,我还没有find任何方式在构build映像时以静默方式在Dockerfile中执行RUN命令。 密码是否可以从其他地方导入并预先附加到命令中,这样就不必再打印了? 或者有没有在Subversion中的无密码authentication的方法,可以在Dockerfile的上下文(无需交互设置)?

Subversion服务器在我公司远程运行,而不是在本地机器或Docker主机上运行。 据我所知,除了通过用户名/密码身份validation访问我的资源库外,我无法访问它,因此将任何密钥文件作为根复制到某些服务器文件夹可能会很困难。

一个解决scheme是ADD你以前在你的builder文件系统上签出的整个SVN目录(或者如果你的Dockerfile本身在SVN仓库中,像这样添加为svn:externalssvn propset svn:externals 'external_svn_directory http://subversion.myserver.com/path/to/directory' . ,然后做一个svn up )。

然后在你的Dockerfile你可以简单的拥有这个:

 ADD external_svn_directory /tmp/external_svn_directory RUN svn export /tmp/external_svn_directory /path/where/to/export/to RUN rm -rf /tmp/external_svn_directory 

Dockerfile RUN命令总是在Docker镜像生成时执行并caching,因此必须在构build时提供svn需要进行身份validation的variables。 您可以在执行docker run时移动svn export调用,以避免这种问题。 为了做到这一点,你可以创build一个bash脚本,并将其声明为docker入口点,并传递用户名和密码的环境variables。 例

 # base image FROM ubuntu ENV REPOSITORY_URL http://subversion.myserver.com/path/to/directory # install subversion client RUN apt-get -y update && apt-get install -y subversion # make it executable before you add it here otherwise docker will coplain ADD docker-entrypoint.sh /enrypoint.sh ENTRYPOINT /entrypoint.sh 

docker-entrypoint.sh

 #!/bin/bash # maybe here some validation that variables $REPO_USER $REPO_PASSOWRD exists. svn export --username="$REMOTE_USER" --password="$REMOTE_PASSWORD" "$REPOSITORY_URL" # continue execution path/to/file.sh 

运行你的图像:

 docker run -e REPO_USER=jane -e REPO_PASSWORD=secret your/image 

或者你可以把variables放在一个文件中:

.svn文件的凭据

 REPO_USER=jane REPO_PASSWORD=secret 

然后运行:

 docker run --env-file .svn-credentials your/image 

完成后删除.svn-credentials文件。

也许使用SVNSSH是一个解决scheme吗? 你可以生成一个公钥/私钥对。 私钥可以被添加到图像,而公钥被添加到服务器。

有关更多详细信息,你可以看看这个stackoverflow问题 。

Subversion在客户端存储authentication详细信息(如果在configuration中没有被禁用),并在请求后使用存储的用户名|密码进行相同URL的后续操作。

因此 – 你必须在Dockerfile中用username | password运行(成功的)svn导出一次,并允许SVN稍后使用caching的凭证(从命令行中移除auth。选项)