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

Dir*_*irk 4 svn authentication docker dockerfile

我想编写一个Dockerfile,将一个目录从远程Subversion存储库导出到构建上下文中,以便在后续命令中使用这些文件。该存储库通过用户/密码身份验证来保护。

该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, e.g. on container start run a file just downloaded from the repository
CMD ["/bin/bash", "path/to/file.sh"]
Run Code Online (Sandbox Code Playgroud)

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

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

到目前为止,我还没有找到如何执行的方法 RUN在构建映像时在Dockerfile中静默命令的。可以将密码从其他地方导入并事先附加到命令,这样就不必再打印了吗?还是在Subversion中有任何无密码身份验证方法可以在Dockerfile上下文中使用(就无需交互设置它们而言)?

Subversion服务器正在我公司中远程运行,而不是在本地计算机或Docker主机上运行。据我所知,除了通过用户名/密码认证访问我的存储库外,我无权访问它,因此将任何密钥文件作为根目录复制到某些服务器文件夹可能很困难。

Erv*_*yka 5

在构建docker 映像时,总是执行并缓存Dockerfile RUN命令,因此 必须在构建时提供svn进行身份验证的变量。您可以在执行docker run时移动svn export调用,以避免此类问题。为此,您可以创建一个bash脚本并将其声明为docker入口点,并为用户名和密码传递环境变量。例

# 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

运行图像:

docker run -e REPO_USER=jane -e REPO_PASSWORD=secret your/image
Run Code Online (Sandbox Code Playgroud)

或者,您可以将变量放在文件中:

.svn凭证

REPO_USER=jane
REPO_PASSWORD=secret
Run Code Online (Sandbox Code Playgroud)

然后运行:

docker run --env-file .svn-credentials your/image
Run Code Online (Sandbox Code Playgroud)

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