【问题标题】:Prevent docker from building the image from scratch after making changes to the code防止 docker 在更改代码后从头开始构建映像
【发布时间】:2018-03-30 13:37:22
【问题描述】:

一个docker新手,尝试在docker容器中开发;我有一个问题,每次我对代码进行单行更改并尝试重新运行容器时,docker 都会从头开始重建图像,这需要很长时间;我应该如何正确设置项目以便充分利用 cache?可以肯定的是,只要我对源代码进行一些更改,它就不必重新安装所有 apt-getpip installs(顺便说一句,我正在使用 python 开发)。任何人都知道我错过了什么。感谢任何帮助。

我当前的 docker 文件:

FROM tiangolo/uwsgi-nginx-flask:python3.6

# Copy the current directory contents into the container at /app
ADD ./app /app

# Run python's package manager and install the flask package
RUN apt-get update -y \
    && apt-get -y install default-jre \
    && apt-get install -y \
    build-essential \
    gfortran \
    libblas-dev \
    liblapack-dev \
    libxft-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
ADD ./requirements.txt /app/requirements.txt
RUN pip3 install -r requirements.txt

【问题讨论】:

  • 对于代码,您可以使用卷指向您的代码
  • 我更喜欢将代码包含到容器中,仅用于生产。对于开发,您可以在容器中安装代码

标签: docker docker-build


【解决方案1】:

一旦 Dockerfile 中的缓存中断,以下所有行都需要重建,因为它们不再有缓存命中。缓存搜索查找现有的前一层和相同的命令(或类似COPY 的内容)以重用缓存。如果两者都不匹配,那么您有一个缓存未命中,它会执行构建步骤。对于您的方案,您只需重新排序行以确保经常更改的部分位于文件末尾而不是文件开头:

FROM tiangolo/uwsgi-nginx-flask:python3.6

# Run python's package manager and install the flask package
RUN apt-get update -y \
    && apt-get -y install default-jre \
    && apt-get install -y \
    build-essential \
    gfortran \
    libblas-dev \
    liblapack-dev \
    libxft-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip3 install -r requirements.txt

# Copy the current directory contents into the container at /app
COPY app /app

我还将您的ADD 行修改为COPY,因为您不需要ADD 提供的额外功能。

在开发过程中,我建议将应用程序作为卷安装在您的容器中,这样您就无需为每次代码更改都重新构建映像。您可以将 COPY app /app 留在 Dockerfile 中,卷挂载将简单地覆盖目录,在该位置隐藏映像中的任何内容。您只需要重新启动容器即可获取您的修改。完成后,构建将创建一个看起来与您的开发环境相同的映像。

【讨论】:

  • 这非常有效。非常感谢。 volume mount 似乎也是一个非常好的开发策略。
  • 你能说更多关于卷挂载的事情吗?为此我使用什么命令?
  • @NicCottrell 当你运行容器时,它看起来像docker run -v "$(pwd)/app:/app your-image
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多