首页 > 解决方案 > 每次部署到 bitbucket 时,如何防止 docker 编译库?是否有任何 bitbucket 管道缓存?

问题描述

我们在 docker 镜像中有我们的 Flask API,我们将这个 docker 推送到 bitbucket 存储库,然后开始部署 bitbucket 管道。

一切都按预期工作,但 OpenCV 的编译平均需要 15 分钟。

我想知道每次我们推送到 bitbucket 时是否有任何方法可以避免这种编译。像缓存这样的东西。

我已阅读有关 bitbucket 管道上的缓存的信息,但它没有按预期工作。

这是我想要改进的 Dockerfile 的一部分:

RUN mkdir /opt && cd /opt && \
  wget -q https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
  unzip ${OPENCV_VERSION}.zip && \
  rm -rf ${OPENCV_VERSION}.zip && \
  mkdir -p /opt/opencv-${OPENCV_VERSION}/build && \
  cd /opt/opencv-${OPENCV_VERSION}/build && \
  CXX=/usr/bin/clang++ CC=/usr/bin/clang cmake \
  -D CMAKE_BUILD_TYPE=RELEASE \
  -D CMAKE_INSTALL_PREFIX=/usr/local \
  -D WITH_FFMPEG=NO \
  -D WITH_IPP=NO \
  -D WITH_OPENEXR=NO \
  -D WITH_TBB=YES \
  -D BUILD_EXAMPLES=NO \
  -D BUILD_ANDROID_EXAMPLES=NO \
  -D INSTALL_PYTHON_EXAMPLES=NO \
  -D BUILD_DOCS=NO \
  -D BUILD_opencv_python2=NO \
  -D BUILD_opencv_python3=ON \
  -D ENABLE_PYTHON3=ON \
  -D PYTHON3_EXECUTABLE=/usr/bin/python3 \  
  .. && \
  make VERBOSE=1 -j8 && \
  make && \
  make install && \
  rm -rf /opt/opencv-${OPENCV_VERSION}

我期待一些解决方案,比如指向 OpenCV Api 的预编译版本。

标签: dockeropencvcmakedocker-composedockerfile

解决方案


我最近遇到了这个问题,并同意缓存似乎没有按预期工作。但是,如果不看你的整体Dockerfile,很难说。ADD's 和COPY's 将使缓存无效,因此我建议您在添加任何文件之前将此部分移至顶部。

更好的解决方案(如果没有预编译版本)是使用基本映像的概念,这是我为将构建时间减少一半所做的工作。基本上,您构建一个基础镜像flask-api-base,它将安装您的所有包并编译 OpenCV,然后您的实际最终镜像将提取FROM flask-api-base:latest并构建您的应用程序特定代码。请记住,如果基础映像发生更改,您可能需要擦除 Bitbucket 缓存。


推荐阅读