Dockerfile - 隐藏 --build-args 在构建时不显示
Dockerfile - Hide --build-args from showing up in the build time
我有以下 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 中传递凭据?
更新
你知道,我关注的是你问题的错误部分。您根本不应该使用用户名和密码。您应该使用 access keys,它允许对私有存储库进行只读访问。
创建 ssh 密钥并将 public 组件添加到存储库后,您可以将私钥放入映像中:
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
环境变量将可用于容器中的进程。
绑定挂载:您可以将您的凭据放在一个文件中,然后使用 docker run
的 -v
选项将该文件作为绑定挂载暴露在您的容器中:
docker run -v /path/to/myfile:/path/inside/container ...
这会将文件公开为容器内的 /path/inside/container
。
Docker 秘密:如果您 运行 Docker 处于集群模式,您可以将您的凭据公开为 docker secrets.
比这更糟糕:他们永远处于 docker history
状态。
我过去在这里做过两件事:
你可以configure pip to use local packages, or to download dependencies ahead of time into "wheel" files。 在 Docker 之外,您可以从私有存储库下载包,在那里提供凭据,然后您可以在生成的 .whl
文件中进行复制。
pip install wheel
pip wheel --wheel-dir ./wheels git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
docker build .
COPY ./wheels/ ./wheels/
RUN pip install wheels/*.whl
第二种是使用多阶段 Docker 文件,其中第一阶段完成所有安装,第二阶段不需要凭据。这可能看起来像
FROM ubuntu:16.04 AS build
RUN apt-get update && ...
...
RUN pip install git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install \
python2.7
COPY --from=build /usr/lib/python2.7/site-packages/ /usr/lib/python2.7/site-packages/
COPY ...
CMD ["./app.py"]
在第二种情况下值得仔细检查没有任何东西泄漏到您的最终图像中,因为 ARG 值仍然可用于第二阶段。
我有以下 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 中传递凭据?
更新
你知道,我关注的是你问题的错误部分。您根本不应该使用用户名和密码。您应该使用 access keys,它允许对私有存储库进行只读访问。
创建 ssh 密钥并将 public 组件添加到存储库后,您可以将私钥放入映像中:
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
环境变量将可用于容器中的进程。绑定挂载:您可以将您的凭据放在一个文件中,然后使用
docker run
的-v
选项将该文件作为绑定挂载暴露在您的容器中:docker run -v /path/to/myfile:/path/inside/container ...
这会将文件公开为容器内的
/path/inside/container
。Docker 秘密:如果您 运行 Docker 处于集群模式,您可以将您的凭据公开为 docker secrets.
比这更糟糕:他们永远处于 docker history
状态。
我过去在这里做过两件事:
你可以configure pip to use local packages, or to download dependencies ahead of time into "wheel" files。 在 Docker 之外,您可以从私有存储库下载包,在那里提供凭据,然后您可以在生成的 .whl
文件中进行复制。
pip install wheel
pip wheel --wheel-dir ./wheels git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
docker build .
COPY ./wheels/ ./wheels/
RUN pip install wheels/*.whl
第二种是使用多阶段 Docker 文件,其中第一阶段完成所有安装,第二阶段不需要凭据。这可能看起来像
FROM ubuntu:16.04 AS build
RUN apt-get update && ...
...
RUN pip install git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install \
python2.7
COPY --from=build /usr/lib/python2.7/site-packages/ /usr/lib/python2.7/site-packages/
COPY ...
CMD ["./app.py"]
在第二种情况下值得仔细检查没有任何东西泄漏到您的最终图像中,因为 ARG 值仍然可用于第二阶段。