Dockerfile-隐藏--build-args在构建时不显示

时间:2019-01-10 09:25:38

标签: docker dockerfile docker-build

我有以下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中传递凭据的方式?

2 个答案:

答案 0 :(得分:3)

更新

您知道,我专注于您问题的错误部分。您完全不应使用用户名和密码 。您应该使用access keys,它允许对私有存储库进行只读访问。

创建了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的{​​{1}}选项将该文件作为绑定安装公开在容器中:

    docker run

    这会将文件显示为docker run -v /path/to/myfile:/path/inside/container ... 在您的容器中。

  • Docker的秘密:如果您正在以群集模式运行Docker,则可以将凭据公开为docker secrets

答案 1 :(得分:3)

比那更糟糕的是:它们永久地处于docker history中。

过去,我在这里完成了两项工作:

您可以configure pip to use local packages或访问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

第二个是使用多阶段Dockerfile,其中第一个阶段完成所有安装,第二个阶段不需要凭据。可能看起来像

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值仍然可用,因此没有任何泄漏到最终图像中。