Как я могу запретить Docker компилировать библиотеку каждый раз при развертывании в bitbucket? Есть ли кэш конвейера с битбакетом? - PullRequest
2 голосов
/ 08 ноября 2019

У нас есть наш Flask API в образе докера, мы помещаем этот докер в репозиторий bitbucket, затем начинаем развертывание конвейера bitbucket.

Все работает, как ожидается, но компиляция 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.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Недавно я столкнулся с этой проблемой и согласен с тем, что кеш работает не так, как ожидалось. Однако, не глядя на весь ваш Dockerfile, трудно сказать. ADD и COPY сделают недействительным кеш, поэтому я рекомендую переместить этот раздел вверх, если есть возможность, прежде чем добавлять какие-либо файлы.

Лучшее решение (если нетпредварительно скомпилированная версия), это использование концепции базового образа, что я и сделал, чтобы сократить время сборки вдвое. По сути, вы строите базовый образ flask-api-base, который установит все ваши пакеты и скомпилирует OpenCV, а затем ваш фактический окончательный образ извлечет FROM flask-api-base:latest и создаст код для вашего приложения. Просто помните, что если базовый образ меняется, вам может потребоваться очистить кэш Bitbucket.

1 голос
/ 08 ноября 2019

Я незнаком с OpenCV, но предположим, что, если есть двоичный файл, который вы можете использовать, это было бы идеальным вариантом.

Мне интересно, почему этот слой (RUN ...)не кэшируется между сборками. Похоже, что вы четко отделяете марку OpenCV от других операторов в вашем Dockerfile, и поэтому этот RUN должен генерировать отдельный слой, который стабилен и, следовательно, повторно используется во всех сборках.

Происходит ли это утверждение после более раннегоНапример, RUN заявления, которые меняются? Если это так, вы можете изменить порядок этого оператора и поместить его ранее в Dockerfile, чтобы этот уровень стал постоянным. См. рекомендации для операторов Dockerfile, которые генерируют слои.

В качестве альтернативы, вы можете создать отдельное изображение, содержащее OpenCV, а затем FROM это изображение в вашем коде. Вы можете сделать это либо с использованием отдельных файлов Docker, либо с помощью многоступенчатых сборок. Таким образом, этот образ, содержащий сборку OpenCV, будет построен только (по вашему требованию) и повторно использован в последующих сборках.

HTH!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...