Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止每次部署到bitbucket时docker编译库?是否存在任何bitbucket管道缓存?_Docker_Opencv_Cmake_Docker Compose_Dockerfile - Fatal编程技术网

如何防止每次部署到bitbucket时docker编译库?是否存在任何bitbucket管道缓存?

如何防止每次部署到bitbucket时docker编译库?是否存在任何bitbucket管道缓存?,docker,opencv,cmake,docker-compose,dockerfile,Docker,Opencv,Cmake,Docker Compose,Dockerfile,我们在docker映像中有Flask API,我们将此docker推送到bitbucket存储库,然后开始部署bitbucket管道 一切正常,但OpenCV的编译平均需要15分钟 我想知道是否有任何方法可以避免每次推到bitbucket时进行编译。比如缓存 我读过关于bitbucket管道上缓存的文章,但它并没有像我预期的那样工作 这是我想改进的Dockerfile的一部分: RUN mkdir /opt && cd /opt && \ wget -q ht

我们在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。

我不熟悉OpenCV,但假设有一个二进制文件可以使用,这将是理想的选择

我很好奇为什么这个层(
RUN…
)没有在构建之间缓存。看起来您正在将OpenCV的make与Dockerfile中的其他语句清晰地分离开来,因此,此
RUN
应该生成一个独特的层,该层是稳定的,因此可以跨构建重用

此语句是否在发生更改的早期语句(例如
RUN
语句)之后出现?如果是这样,您可能希望对该语句重新排序,并将其放在Dockerfile的前面,以便该层保持不变。有关生成图层的Dockerfile语句,请参见


或者,您可以创建一个包含OpenCV的单独图像,然后在代码构建中从该图像创建
。您可以使用不同的DockerFile或多阶段构建来实现这一点。这样,包含OpenCV构建的此映像将仅根据(您的)需求构建,并在后续构建中重用。

我最近遇到了这个问题,并同意缓存似乎无法按预期工作。但是,如果不查看整个
Dockerfile
,就很难说了
ADD
COPY
将使缓存无效,因此我建议您在添加任何文件之前,尽可能将此部分上移到顶部


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

我使用的解决方案是创建自己的映像,将其上载到Docker hub,然后在此基础上创建一个新映像

因此,第一个docker映像应该包含我的系统使用的所有基本库。
第二个是环境变量和api本身。

我决定实现这个解决方案,因为它在这里看起来最简单。最终的映像创建速度已经更快了,现在我将测试bitbucket部署管道。