【问题标题】:COPY .tar.gz needed in Dockefile or not?Dockerfile 中是否需要 COPY .tar.gz?
【发布时间】:2020-12-09 14:20:44
【问题描述】:

这里是 Docker 新手,关于 Docker 化 Django 时的 COPY 命令的快速问题。

我认为 COPY 命令用于将本地文件复制到 Docker 容器/上下文中,否则,就 Docker 而言,在构建期间该文件不存在。

我正在关注的教程中的开发 Dockerfile 有这个部分:

# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

所以我明白,如果在构建过程中没有那个 COPY 命令,第二个 RUN 命令会失败,因为它不知道 requirements.txt 是什么。因此,由于我想安装我的 django-polls 应用程序压缩包,我添加了一个 COPY 并将该短语添加到第二个 RUN:

# install dependencies
COPY ./requirements.txt .
COPY ./django-polls-0.1.tar.gz .
RUN pip install --upgrade pip && pip install -r requirements.txt && pip install django-polls-0.1.tar.gz

如您所见,我组合了两个 RUN 命令,添加了 COPY .tar.gz 行,并将 .tar.gz 安装附加到 RUN 命令的末尾。所以我有两个问题,第二个是这篇文章的重点:

  1. 是否有必要将pip install --upgrade pip 移动到最终的 RUN 命令中?我知道两个不同的 RUN 命令不会相互影响,因此最初的第一个 RUN 什么也没做。

  2. 是否有必要添加第二个 COPY 命令?我问是因为我认为是,但后来我意识到我在生产 Dockerfile 中省略了它,它仍然能够安装 django-polls。

也就是说,我的生产 Dockerfile 有以下几行:

# install dependencies
COPY ./requirements.txt .
RUN pip install --upgrade pip && pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt && pip install django-polls-0.1.tar.gz

即使没有COPY ./django-polls-0.1.tar.gz . 行,它也能够安装 django-polls。我在这里不明白什么?

谢谢

【问题讨论】:

    标签: python django docker pip


    【解决方案1】:

    是否有必要将 pip install --upgrade pip 移动到最终的 RUN 命令中?我知道两个不同的 RUN 命令不会相互影响,因此最初的第一个 RUN 什么都不做。

    这并不是真的需要工作,但它在某种程度上是一种最佳实践,因为您在 Dockerfile 中添加的每个 RUN 命令都会向生成的 Docker 映像添加一个新层。因此,如果可能,并且您没有从缓存中受益(yayers 在构建过程中被缓存),您应该将它组合成一个 RUN 命令。

    是否有必要添加第二个 COPY 命令?我问是因为我认为是,但后来我意识到我在生产 Dockerfile 中省略了它,它仍然能够安装 django-polls。

    对于COPY 命令,您完全了解它的工作原理。所以是的,这应该是必要的。

    即使没有 COPY ./django-polls-0.1.tar.gz 。行,它能够安装 django-polls。我在这里不明白什么?

    根据您在此处列出的内容,这无法正常工作。这样做的唯一原因可能是因为文件是在上一步中以某种方式添加/安装的,我无法确定,因为您没有在此处列出完整的 Dockerfile。

    最好的问候Shogoki

    【讨论】:

    • 感谢您的回复。是的,看起来 Docker 正在缓存一些东西,但仍然不确定为什么教程在他们自己的 RUN 中运行 pip 升级。感谢您确认复制功能。你认为之前的COPY . . 行可能会复制 tar.gz 以及其他所有内容吗?
    • 如果requirements.txt 文件发生更改,COPY 命令之前的RUN 命令将不会重复。但是如果某处有COPY . . 行,那实际上会复制整个目录,您不需要单独复制单个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多