在Docker中保护私有PyPi的凭据

o75abkj4  于 2023-08-03  发布在  Docker
关注(0)|答案(2)|浏览(84)

我正在构建一个Docker镜像,需要运行pip install vs一个带凭据的私有PyPi。保护凭据的最佳方法是什么?使用各种文件配置选项(pip.conf、requirements.txt、.netrc)仍然是一个漏洞,即使我删除它们,因为它们可以恢复。环境变量也是可见的。最安全的方法是什么?

iklwldmw

iklwldmw1#

我理解您希望在构建时提供这些凭据,然后在构建后将其丢弃。
那么,使用pip处理此问题的最安全方法是使用多阶段构建过程。
首先,您需要声明一个初始的build-image,其中包含文件配置和下载/编译所需包所需的任何依赖项;不要担心恢复这些文件的可能性,因为您只会在构建过程中使用它们。
然后定义不带构建依赖项的最终映像,并仅复制要从项目运行的源代码和构建映像中的依赖项。生成的映像将没有配置文件,并且不可能恢复它们,因为它们从未存在过。

FROM python:3.10-slim as build
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
    build-essential gcc

WORKDIR /usr/app
RUN python -m -venv /usr/app/venv
ENV PATH="/usr/app/venv/bin:$PATH"

[HERE YOU COPY YOUR CONFIGURATION FILES WITH CREDENTIALS]
COPY requirements.txt
RUN pip install -r requirements

FROM python:3.10-slim
WORKDIR /usr/app
COPY --from=build /usr/app/venv ./venv
[HERE YOU COPY YOUR SOURCE CODE INTO YOUR CURRENT WORKDIR]

ENV PATH="/usr/app/venv/bin:$PATH"
ENTRYPOINT ["python", "whatever.py"]

字符串

blpfk2vs

blpfk2vs2#

此外,还有一个Docker BuildKit功能,可以将带有secret的文件作为绑定挂载传递到Dockerfile,而无需将其存储在层中。
这样的绑定挂载可以在RUN指令中定义如下

FROM python:slim

COPY requirements.txt requirements.txt
RUN --mount=type=secret,id=PIP_CONF_SECRET_ID,dst=/etc/pip.conf,readonly \
    pip3 install --no-cache-dir -r requirements.txt

字符串
docker build上,源值可以这样传递

docker image build --secret id=PIP_CONF_SECRET_ID,src=${PIP_CONFIG_FILE} -t my-image:latest .

相关问题