Docker:是否可以不使用缓存从头开始构建?

时间:2019-04-09 09:38:56

标签: docker docker-build

我有一个简单的Docker文件:

FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install -r requirements

问题是-它在每个版本上都安装了需求。我有很多要求,但很少改变。

我搜索了解决方案并得出以下结论:

FROM python:3.6
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app

那很好,直到它停止更新代码为止。例如,在转到/ app和build的某些文件中注释几行-这些行在图像中保持注释。

我再次搜索,发现这可能是由缓存引起的。我尝试了 -no-cache 构建标记,但是现在我又重新安装了需求。

在我的情况下,有什么解决方法或正确的方法吗?

3 个答案:

答案 0 :(得分:2)

如果要使缓存无效,则应使用ADD而不是COPY

FROM python:3.6
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
ADD . /app

尝试上面的docker文件。

答案 1 :(得分:1)

更改Docker不会看到您仅复制到(COPY . /app)中的文件,因此它将使用缓存的层*,从而得到您的结果。使用--no-cache将强制重新构建每一层,再次说明您观察到的内容。

避免每次都重新安装所有需求的“码头工人”方法是将所有静态需求放置在基本映像中,然后在您的FROM行中使用此映像以及所有其他需要更改的需求


*尽管,我可以肯定地说,如果您复制的是命名文件(而不是目录),即使没有--no-cache ,更改也会被拾取

答案 2 :(得分:1)

您曾经使用过docker-compose吗? Docker-compose具有“卷”,它作为缓存,并且当您启动容器时,它不会重新构建您的依赖项。当您的代码更改时,它将自动刷新。 根据您的情况,您应该这样做:

FROM python:3.6
WORKDIR /app
COPY . /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
CMD["python","app.py"]

请尝试。