我们在docker镜像中有Flask API,我们将这个docker推送到比特桶存储库,然后开始部署比特桶管道。
一切如预期,但OpenCV的编译平均需要15分钟
我想知道是否有任何方法可以避免每次我们推到比特桶时进行这种编译。像缓存之类的东西。
我读过关于位桶管道上的缓存的文章,但它并没有像我预期的那样工作。
这是我想要改进的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的预编译版本。
我最近遇到了这个问题,并同意缓存似乎没有按预期工作。然而,如果不看你的整个Dockerfile
,就很难说。ADD
和COPY
将使缓存无效,因此如果可以的话,我建议您在添加任何文件之前将此部分移到顶部。
一个更好的解决方案(如果没有预编译版本(是使用基本映像的概念,这就是我所做的将构建时间缩短一半的方法。基本上,您构建了一个基本映像flask-api-base
,它将安装您的所有包并编译OpenCV,然后您的实际最终映像将提取FROM flask-api-base:latest
并构建您的应用程序特定代码。请记住,如果基本映像发生更改,您可能需要擦除Bitbucket缓存。
我使用的解决方案是创建自己的映像,将其上传到Docker hub,并在此基础上创建一个新映像。
因此,第一个docker映像应该包含我的系统使用的所有基本库。第二个是环境变量和api本身。