我有一个简单的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 构建标记,但是现在我又重新安装了需求。
在我的情况下,有什么解决方法或正确的方法吗?
答案 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"]
请尝试。