首页 > 解决方案 > 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 中传递凭据?

标签: dockerdockerfiledocker-build

解决方案


更新

你知道,我关注的是你问题的错误部分。您根本不应该使用用户名和密码您应该使用访问密钥,它允许对私有存储库进行只读访问。

创建 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 ...
    

    USERNAMEPASSWORD环境变量将可用于容器中的进程。

  • -v绑定挂载:您可以将凭据放在文件中,然后使用以下选项将该文件作为绑定挂载暴露在容器中docker run

    docker run -v /path/to/myfile:/path/inside/container ...
    

    这会将文件公开为/path/inside/container您的容器内。

  • Docker 机密:如果您在 swarm 模式下运行 Docker,则可以将您的凭据公开为docker secrets


推荐阅读