在不在屏幕上打印密码的情况下在 Dockerfile 中颠覆 export/checkout
Subversion export/checkout in Dockerfile without printing the password on screen
我想编写一个 Docker 文件,将一个目录从远程 Subversion 存储库导出到构建上下文中,这样我就可以在后续命令中使用这些文件。存储库受 user/password 身份验证保护。
那个 Docker 文件可能如下所示:
# 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"]
但是,这有一个缺点,即在屏幕上或任何指向 stdout 的日志文件上打印我的用户名和密码,如 Step 2 : RUN svn export --username=myUserName --password=myPassword http://subversion.myserver.com/path/to/directory
中所示。在我的例子中,这是一个 Jenkins 构建日志,其他不应该看到凭据的人也可以访问它。
在输出中隐藏用户名和密码的最简单方法是什么?
到目前为止,我还没有找到任何方法如何在构建映像时静默地执行 Docker 文件中的 RUN
命令。密码是否可以从其他地方导入并预先附加到命令,这样就不必再打印了?或者在 Subversion 中是否有任何可以在 Docker 文件上下文中工作的无密码身份验证方法(就无需交互的设置而言)?
Subversion 服务器 运行 在我公司远程,而不是在我的本地计算机或 Docker 主机上。据我所知,除了通过 username/password 身份验证访问我的存储库外,我无法访问它,因此将任何密钥文件作为根目录复制到某些服务器文件夹可能很困难。
也许使用 SVN
和 SSH
是适合您的解决方案?您可以生成 public/private 密钥对。私钥可以添加到图像,而 public 密钥被添加到服务器。
有关更多详细信息,您可以查看 this Whosebug question。
Subversion 在客户端存储身份验证详细信息(如果未在配置中禁用),并根据请求使用存储的用户名|密码进行后续操作 URL。
因此 - 您必须运行(成功)svn export in Dockerfile with username|password only once and allow SVN to use cached credentials (remove auth.options from command-line) later
一个解决方案是 ADD
您之前在构建器文件系统上检出的整个 SVN 目录(或者添加为 svn:externals
如果您的 Dockerfile
本身在 SVN 中像这样的存储库:svn 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 运行 命令总是在构建 docker 图像时执行并缓存,因此 svn 需要在构建时提供身份验证。您可以在执行 docker 运行 时移动 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
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
或者您可以将变量放在一个文件中:
.svn-credentials
REPO_USER=jane
REPO_PASSWORD=secret
然后 运行:
docker run --env-file .svn-credentials your/image
完成后删除 .svn-credentials 文件。
我想编写一个 Docker 文件,将一个目录从远程 Subversion 存储库导出到构建上下文中,这样我就可以在后续命令中使用这些文件。存储库受 user/password 身份验证保护。
那个 Docker 文件可能如下所示:
# 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"]
但是,这有一个缺点,即在屏幕上或任何指向 stdout 的日志文件上打印我的用户名和密码,如 Step 2 : RUN svn export --username=myUserName --password=myPassword http://subversion.myserver.com/path/to/directory
中所示。在我的例子中,这是一个 Jenkins 构建日志,其他不应该看到凭据的人也可以访问它。
在输出中隐藏用户名和密码的最简单方法是什么?
到目前为止,我还没有找到任何方法如何在构建映像时静默地执行 Docker 文件中的 RUN
命令。密码是否可以从其他地方导入并预先附加到命令,这样就不必再打印了?或者在 Subversion 中是否有任何可以在 Docker 文件上下文中工作的无密码身份验证方法(就无需交互的设置而言)?
Subversion 服务器 运行 在我公司远程,而不是在我的本地计算机或 Docker 主机上。据我所知,除了通过 username/password 身份验证访问我的存储库外,我无法访问它,因此将任何密钥文件作为根目录复制到某些服务器文件夹可能很困难。
也许使用 SVN
和 SSH
是适合您的解决方案?您可以生成 public/private 密钥对。私钥可以添加到图像,而 public 密钥被添加到服务器。
有关更多详细信息,您可以查看 this Whosebug question。
Subversion 在客户端存储身份验证详细信息(如果未在配置中禁用),并根据请求使用存储的用户名|密码进行后续操作 URL。
因此 - 您必须运行(成功)svn export in Dockerfile with username|password only once and allow SVN to use cached credentials (remove auth.options from command-line) later
一个解决方案是 ADD
您之前在构建器文件系统上检出的整个 SVN 目录(或者添加为 svn:externals
如果您的 Dockerfile
本身在 SVN 中像这样的存储库:svn 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 运行 命令总是在构建 docker 图像时执行并缓存,因此 svn 需要在构建时提供身份验证。您可以在执行 docker 运行 时移动 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
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
或者您可以将变量放在一个文件中:
.svn-credentials
REPO_USER=jane
REPO_PASSWORD=secret
然后 运行:
docker run --env-file .svn-credentials your/image
完成后删除 .svn-credentials 文件。