docker - Dockerfile - 隐藏 --build-args 以免在构建时出现
问题描述
我有以下 Dockerfile:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
git \
make \
python-pip \
python2.7 \
python2.7-dev \
ssh \
&& apt-get autoremove \
&& apt-get clean
ARG password
ARG username
ENV password $password
ENV username $username
RUN pip install git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
我使用以下命令从这个 Dockerfile 构建映像:
docker build -t myimage:v1 --build-arg password="somepassoword" --build-arg username="someuser" .
但是,在构建日志中,我传递的用户名和密码--build-arg
是可见的。
Step 8/8 : RUN pip install git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
---> Running in 650d9423b549
Collecting git+http://someuser:somepassword@org.bitbucket.com/scm/do/repo.git
如何隐藏它们?或者是否有不同的方式在 Dockerfile 中传递凭据?
解决方案
更新
你知道,我关注的是你问题的错误部分。您根本不应该使用用户名和密码。您应该使用访问密钥,它允许对私有存储库进行只读访问。
创建 ssh 密钥并将公共组件添加到存储库后,您可以将私钥放入映像中:
RUN mkdir -m 700 -p /root/.ssh
COPY my_access_key /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
现在您可以在安装 Python 项目时使用该密钥:
RUN pip install git+ssh://git@bitbucket.org/you/yourproject.repo
(原答案如下)
您通常不会将凭据烘焙到这样的图像中。除了您已经发现的问题之外,它还降低了您的映像的用处,因为您需要在每次更改凭据时重新构建它,或者如果不止一个人希望能够使用它。
凭证更普遍地在运行时通过各种机制之一提供:
环境变量:您可以将凭据放在文件中,例如:
USERNAME=myname PASSWORD=secret
然后将其包含在
docker run
命令行中:docker run --env-file myenvfile.env ...
USERNAME
和PASSWORD
环境变量将可用于容器中的进程。-v
绑定挂载:您可以将凭据放在文件中,然后使用以下选项将该文件作为绑定挂载暴露在容器中docker run
:docker run -v /path/to/myfile:/path/inside/container ...
这会将文件公开为
/path/inside/container
您的容器内。Docker 机密:如果您在 swarm 模式下运行 Docker,则可以将您的凭据公开为docker secrets。
推荐阅读
- authentication - 使用 Azure 应用服务身份验证的 HttpContext 用户为空
- c# - 使用 Microsoft.CodeAnalysis/Roslyn 获取 XML 文档
- javascript - 如何使用 XPath 解析 JavaScript 内容
- mongodb - $查找对象数组中的id
- c# - 如何在 C# 6.0 的泛型类中包含特定于类型的代码?
- python - 使用 python 对数据框进行多处理 SQL 查询
- python-3.x - 来自不同格式数据帧的新数据帧
- python - 如何将用户给出的输入与python中的整数或字符串进行比较
- node.js - docker 内的节点进程内存有限 - 可用方式低于
- reactjs - 类型 '(props: RouteProps) => JSX.Element' 不可分配给类型 'PropsWithChildren
'