Dockerfile - 在构建时隐藏 --build-args

ANI*_*NIL 5 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
Run Code Online (Sandbox Code Playgroud)

我使用以下命令从这个 Dockerfile 构建镜像:

docker build -t myimage:v1 --build-arg password="somepassoword" --build-arg username="someuser" .
Run Code Online (Sandbox Code Playgroud)

但是,在构建日志中,我传递的用户名和密码--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
Run Code Online (Sandbox Code Playgroud)

如何隐藏它们?或者是否有不同的方式在 Dockerfile 中传递凭据?

lar*_*sks 5

更新

你知道,我关注的是你问题的错误部分。你不应该使用一个用户名和密码在所有。您应该使用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
Run Code Online (Sandbox Code Playgroud)

现在您可以在安装 Python 项目时使用该密钥:

RUN pip install git+ssh://git@bitbucket.org/you/yourproject.repo
Run Code Online (Sandbox Code Playgroud)

(原答案如下)

您通常不会将凭据烘焙到这样的图像中。除了您已经发现的问题之外,它还会使您的映像变得不那么有用,因为您每次更改凭据时都需要重新构建它,或者如果不止一个人希望能够使用它。

通常在运行时通过各种机制之一提供凭据:

  • 环境变量:您可以将您的凭据放在一个文件中,例如:

    USERNAME=myname
    PASSWORD=secret
    
    Run Code Online (Sandbox Code Playgroud)

    然后在docker run命令行中包含它:

    docker run --env-file myenvfile.env ...
    
    Run Code Online (Sandbox Code Playgroud)

    USERNAMEPASSWORD环境变量将提供给您的容器进程。

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

    docker run -v /path/to/myfile:/path/inside/container ...
    
    Run Code Online (Sandbox Code Playgroud)

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

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


Dav*_*aze 5

更糟糕的是:他们docker history永远在。

过去,我在这里做了两件有效的事情:

您可以将 pip 配置为使用本地包,或者提前将依赖项下载到“wheel”文件中在 Docker 之外,您可以从私有存储库下载包,在那里提供凭据,然后您可以在生成的.whl文件中复制。

pip install wheel
pip wheel --wheel-dir ./wheels git+http://$username:$password@org.bitbucket.com/scm/do/repo.git
docker build .
Run Code Online (Sandbox Code Playgroud)
COPY ./wheels/ ./wheels/
RUN pip install wheels/*.whl
Run Code Online (Sandbox Code Playgroud)

第二种是使用多阶段 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"]
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,值得仔细检查是否没有任何内容泄漏到您的最终图像中,因为 ARG 值仍可用于第二阶段。