【问题标题】:Prevent docker-compose from reinstalling requirements.txt while using a built image防止 docker-compose 在使用构建的图像时重新安装 requirements.txt
【发布时间】:2020-03-19 12:41:21
【问题描述】:

我有一个应用程序 ABC,我想将它放在 docker 环境中。我构建了一个 Dockerfile 并获得了我在 docker-compose.yml 中使用的图像 abcd1234 但是在尝试构建 docker-compose 时,所有 requirements.txt 文件都被重新安装。能不能不使用已经存在的镜像,防止时间重装?

我是 docker 新手,想了解所有参数。另外,“上下文”是否正确?在 docker-compose.yml 中还是应该包含图像内的路径?

PS,我的 docker-compose.yml 不在项目的同一目录中,因为我将使用多个图像来公开更多端口。

docker-compose.yml:


services:
  app:
    build:
      context: /Users/user/Desktop/ABC/
    ports:
      - "8000:8000"
    image: abcd1234
    command: >
      sh -c "python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"
    environment:
      - PROJECT_ENV=development

Dockerfile:

FROM python:3.6-slim-buster AS build
MAINTAINER ABC

ENV PYTHONUNBUFFERED 1

RUN python3 -m venv /venv
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y git && \
    apt-get install -y build-essential && \
    apt-get install -y awscli && \
    apt-get install -y unzip && \
    apt-get install -y nano

RUN apt-get install -y libsm6 libxext6 libxrender-dev

COPY . /ABC/

RUN apt-cache search mysql-server
RUN apt-cache search libmysqlclient-dev
RUN apt-get install -y libpq-dev
RUN apt-get install -y postgresql
RUN apt-cache search postgresql-server-dev-9.5


RUN pip install --upgrade awscli==1.14.5 s3cmd==2.0.1 python-magic
RUN pip install -r /ABC/requirements.txt

WORKDIR .

请指导我如何处理这两种情况。谢谢!

【问题讨论】:

  • 如何启动服务?如果您正在执行docker-compose up,除非您指定--build 标志,否则不会重建图像。
  • 您还可以优化您的 Dockerfile。您可以将COPY . /ABC/ 放在底部,在安装依赖项之前,您只需复制requirements.txt。这样,除非您实际添加了一些依赖项(Docker 可以重用缓存中的层),否则您的依赖项不会在每个构建中重新安装。因此,当您更改代码中的某些内容时,只会重建该层(以及下面/之后的层)。
  • 感谢@StefanGolubović dockerfile 的构建在第一次尝试中是成功的,我想避免在构建 docker-compose 时重新安装 requirements.txt。也会尝试这种方式。 PS。我将创建容器并在 8000 端口(通过邮递员)访问 Django 应用程序的 API,并将在 docker-compose. 中集成多个应用程序,每个应用程序位于不同的端口。
  • 不安装 requirements.txt 应该如何工作?

标签: python python-3.x docker docker-compose dockerfile


【解决方案1】:

context: 目录是主机系统上包含Dockerfile 的目录。它与您传递给docker build 的目录相同,并且通常只是当前目录.

在 Dockerfile 中,Docker 可以缓存单个构建步骤,这样它就不会重复它们,但只会在它到达某些地方发生变化之前。该“某事”可以是更改的 RUN 行,但在您的 COPY 处,如果您的本地源代码树中的任何文件都发生了更改,那么它之后的所有内容都会使其缓存无效。

因此,一个典型的 Dockerfile 有几个“阶段”;你也可以用其他语言重复这种模式。您可以按以下顺序重组 Dockerfile:

# 1. Base information; this almost never changes
FROM python:3.6-slim-buster AS build
MAINTAINER ABC
ENV PYTHONUNBUFFERED 1
WORKDIR /ABC

# 2. Install OS packages.  Doesn't depend on your source tree.
# Frequently just one RUN line (but could be more if you need
# packages that aren't in the default OS package repository).
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
      build-essential unzip libxrender-dev libpq-dev

# 3. Copy _only_ the file that declares language-level dependencies.
# Repeat starting from here only if this file changes.
COPY requirements.txt .
RUN pip install -r requirements.txt

# 4. Copy the rest of the application in.  In a compiled language
# (Javascript/Webpack, Typescript, Java, Go, ...) build it.
COPY . .

# 5. Explain how to run the application.
EXPOSE 8000
CMD python manage.py migrate && \
    python manage.py runserver 0.0.0.0:8000

【讨论】:

  • 非常感谢..帮助。 PS,了解一件事,...如果我们使用 docker-compose,则无需构建 dockerfile ...因为最终我们将在运行之前先构建 docker-compose。在掌握概念时犯了错误..但最终得到了它。
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多