diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index a8687a1..0000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,6 +0,0 @@ -# This is a comment. -# Each line is a file pattern followed by one or more owners. - -# These owners will be the default owners for everything in the repo. Unless a later match takes precedence, -# @global-owner1 and @global-owner2 will be requested for review when someone opens a pull request. -* @borda diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 15cdcc8..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug, help wanted -assignees: '' ---- - -## 🐛 Bug - - - -### To Reproduce - -Steps to reproduce the behavior: - -1. Go to '...' -1. Run '....' -1. See error - - - -### Expected behavior - - - -### Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 36269e3..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement, help wanted -assignees: '' ---- - -## 🚀 Feature - - - -### Motivation - - - -### Alternatives - - - -### Additional context - - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 7642926..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,18 +0,0 @@ -# Before submitting - -- [ ] Was this discussed/approved via a Github issue? (no need for typos and docs improvements) -- [ ] Did you make sure to update the docs? -- [ ] Did you write any new necessary tests? - -## What does this PR do? - -Fixes #(issue). - -## PR review - -Anyone in the community is free to review the PR once the tests have passed. -If we didn't discuss your PR in Github issues there's a high chance it will not be merged. - -## Did you have fun? - -Make sure you had fun coding 🙃 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3134295..fa6502c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,25 +1,6 @@ # Basic dependabot.yml file with minimum configuration for two package managers - version: 2 updates: - # Enable version updates for python - - package-ecosystem: "pip" - # Look for a `requirements` in the `root` directory - directory: "/" - # Check for updates once a week - schedule: - interval: "monthly" - # Labels on pull requests for version updates only - labels: - - "CI / tests" - pull-request-branch-name: - # Separate sections of the branch name with a hyphen for example, `dependabot-npm_and_yarn-next_js-acorn-6.4.1` - separator: "-" - # Allow up to 5 open pull requests for pip dependencies - open-pull-requests-limit: 5 - reviewers: - - "borda" - # Enable version updates for GitHub Actions - package-ecosystem: "github-actions" directory: "/" diff --git a/.github/workflows/ci_schema.yml b/.github/workflows/ci_schema.yml index 639dd3c..4e7b118 100644 --- a/.github/workflows/ci_schema.yml +++ b/.github/workflows/ci_schema.yml @@ -10,7 +10,7 @@ jobs: timeout-minutes: 10 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install pkg run: pip install "check-jsonschema>=0.10" diff --git a/.github/workflows/code-format.yml b/.github/workflows/code-format.yml index 1242cef..29924e8 100644 --- a/.github/workflows/code-format.yml +++ b/.github/workflows/code-format.yml @@ -9,14 +9,14 @@ jobs: pre-commit-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 - name: set PY run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV - - uses: actions/cache@v3.0.11 + - uses: actions/cache@v3 with: path: ~/.cache/pre-commit key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} diff --git a/.github/workflows/docker-builds.yml b/.github/workflows/docker-builds.yml index cf9d1a2..79689a4 100644 --- a/.github/workflows/docker-builds.yml +++ b/.github/workflows/docker-builds.yml @@ -1,11 +1,13 @@ name: Publish Docker Image # https://www.docker.com/blog/first-docker-github-action-is-here # https://github.com/docker/build-push-action -on: # Trigger the workflow on push or pull request, but only for the master branch +on: # Trigger the workflow on push or pull request, but only for the master branch push: - branches: [ master ] + branches: + - master pull_request: - branches: [ master ] + branches: + - master concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref }} @@ -17,29 +19,36 @@ jobs: strategy: fail-fast: false matrix: - python_version: ["2.7", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11"] - opencv_version: ["4.6.0"] + ubuntu_version: ["20.04"] + python_version: ["2.7", "3.6", "3.7", "3.8", "3.9"] + opencv_version: ["4.9.0"] device: ["cpu", "gpu"] + include: + - { ubuntu_version: "22.04", python_version: "3.10", opencv_version: "4.9.0", device: "cpu" } + - { ubuntu_version: "22.04", python_version: "3.10", opencv_version: "4.9.0", device: "gpu" } + - { ubuntu_version: "22.04", python_version: "3.11", opencv_version: "4.9.0", device: "cpu" } + - { ubuntu_version: "22.04", python_version: "3.11", opencv_version: "4.9.0", device: "gpu" } steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 # https://github.com/docker/setup-buildx-action # Set up Docker Buildx - to use cache-from and cache-to argument of buildx command - - uses: docker/setup-buildx-action@v2 + - uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 if: github.ref == 'refs/heads/master' with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - uses: docker/build-push-action@v3 + - uses: docker/build-push-action@v5 # https://github.com/docker/build-push-action#cache-to-registry with: build-args: | + UBUNTU_VERSION=${{ matrix.ubuntu_version }} PYTHON_VERSION=${{ matrix.python_version }} OPENCV_VERSION=${{ matrix.opencv_version }} file: ${{ matrix.device }}/Dockerfile # publish master push: ${{ github.ref == 'refs/heads/master' }} - tags: borda/docker_python-opencv-ffmpeg:${{ matrix.device }}-py${{ matrix.python_version }}-cv${{ matrix.opencv_version }} + tags: dzynetech/docker_python-opencv-ffmpeg:${{ matrix.device }}-py${{ matrix.python_version }}-cv${{ matrix.opencv_version }} timeout-minutes: 240 diff --git a/.github/workflows/label-conflicts.yml b/.github/workflows/label-conflicts.yml new file mode 100644 index 0000000..f0ce1cf --- /dev/null +++ b/.github/workflows/label-conflicts.yml @@ -0,0 +1,22 @@ +name: Label conflicts + +on: + push: + branches: ["master"] + pull_request_target: + types: ["synchronize", "reopened", "opened"] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + triage-conflicts: + runs-on: ubuntu-latest + steps: + - uses: mschilde/auto-label-merge-conflicts@8c6faa8a252e35ba5e15703b3d747bf726cdb95c # Oct 25, 2021 + with: + CONFLICT_LABEL_NAME: "has conflicts" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAX_RETRIES: 3 + WAIT_MS: 5000 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f6a1284..dd74bca 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,12 +1,12 @@ ci: autofix_prs: true - autoupdate_commit_msg: '[pre-commit.ci] pre-commit suggestions' + autoupdate_commit_msg: "[pre-commit.ci] pre-commit suggestions" autoupdate_schedule: quarterly # submodules: true repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.1.0 + rev: v4.4.0 hooks: - id: end-of-file-fixer - id: trailing-whitespace @@ -17,10 +17,27 @@ repos: - id: check-added-large-files - id: detect-private-key + - repo: https://github.com/codespell-project/codespell + rev: v2.2.5 + hooks: + - id: codespell + - repo: https://github.com/executablebooks/mdformat - rev: 0.7.14 + rev: 0.7.16 hooks: - id: mdformat additional_dependencies: - mdformat-gfm - mdformat_frontmatter + + - repo: https://github.com/pryorda/dockerfilelint-precommit-hooks + rev: v0.1.0 + hooks: + - id: dockerfilelint + + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.0.3 + hooks: + - id: prettier + # https://prettier.io/docs/en/options.html#print-width + args: ["--print-width=120"] diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c5646f7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +# Ignore all MD files: +**/*.md diff --git a/README.md b/README.md index a4caf1e..11d1b98 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,18 @@ # Docker: Python-OpenCV-FFmpeg(-CUDA) -Repository for clean Dockerfile containing [FFmpeg](https://www.ffmpeg.org/), [OpenCV4](https://opencv.org/) and [Python2/3](https://www.python.org/), based on [Ubuntu](https://www.ubuntu.com/) 20.04 LTS. +Repository for clean Dockerfile containing [FFmpeg](https://www.ffmpeg.org/), [OpenCV4](https://opencv.org/) and [Python3](https://www.python.org/), based on [Ubuntu](https://www.ubuntu.com/) 20.04 LTS. ## Tags -- `:cpu-pyX.y-cvX.y.z` for Python 2.x/3.x, OpenCV 4.6.x, FFmpeg -- `:gpu-pyX.y-cvX.y.z` for Python 2.x/3.x, OpenCV 4.6.x, FFmpeg with CUDA 11.4 support +- `:cpu-pyX.y-cvX.y.z` for Python 3.x, OpenCV 4.9.x, FFmpeg +- `:gpu-pyX.y-cvX.y.z` for Python 3.x, OpenCV 4.9.x, FFmpeg with CUDA 11.4 support ## Build -[![Publish Docker Image](https://github.com/Borda/docker_python-opencv-ffmpeg/workflows/Publish%20Docker%20Image/badge.svg?branch=master&event=push)](https://github.com/Borda/docker_python-opencv-ffmpeg/actions?query=workflow%3A%22Publish+Docker+Image%22) -[![Docker Build Status](https://img.shields.io/docker/cloud/build/borda/docker_python-opencv-ffmpeg)](https://hub.docker.com/r/borda/docker_python-opencv-ffmpeg) -[![DockerHub Pulls](https://img.shields.io/docker/pulls/borda/docker_python-opencv-ffmpeg.svg)](https://hub.docker.com/r/borda/docker_python-opencv-ffmpeg) -[![Docker](https://img.shields.io/docker/automated/borda/docker_python-opencv-ffmpeg)](https://hub.docker.com/r/borda/docker_python-opencv-ffmpeg) - - +[![Publish Docker Image](https://github.com/dzynetech/docker_python-opencv-ffmpeg/workflows/Publish%20Docker%20Image/badge.svg?branch=master&event=push)](https://github.com/dzynetech/docker_python-opencv-ffmpeg/actions?query=workflow%3A%22Publish+Docker+Image%22) +[![Docker Build Status](https://img.shields.io/docker/cloud/build/bjubes/docker_python-opencv-ffmpeg)](https://hub.docker.com/r/bjubes/docker_python-opencv-ffmpeg) +[![DockerHub Pulls](https://img.shields.io/docker/pulls/bjubes/docker_python-opencv-ffmpeg.svg)](https://hub.docker.com/r/bjubes/docker_python-opencv-ffmpeg) +[![Docker](https://img.shields.io/docker/automated/bjubes/docker_python-opencv-ffmpeg)](https://hub.docker.com/r/bjubes/docker_python-opencv-ffmpeg) First you need to install docker on your local computer, see following [tutorial](https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository). Note, for running the docker properly you have be logged as superuser otherwise you will face many partial issues which sometimes does not make much sense. @@ -25,7 +21,7 @@ You can build it on your own, note it takes lots of time, be prepared. ```bash git clone cd docker_python-opencv-ffmpeg -docker image build -t python-opencv-ffmpeg:py3.8 -f gpu/Dockerfile --build-arg PYTHON_VERSION=3.8 . +docker image build -t python-opencv-ffmpeg:py3.9 -f cpu/Dockerfile --build-arg PYTHON_VERSION=3.9 . ``` To build other versions, select different Dockerfile. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 72d781d..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-tactile diff --git a/cpu/Dockerfile b/cpu/Dockerfile index 38f48ce..881574e 100644 --- a/cpu/Dockerfile +++ b/cpu/Dockerfile @@ -1,32 +1,39 @@ # https://www.learnopencv.com/install-opencv3-on-ubuntu/ # https://www.osradar.com/how-to-install-opencv-on-ubuntu-20-04/ -FROM ubuntu:20.04 +ARG UBUNTU_VERSION=22.04 -LABEL maintainer="https://github.com/Borda" +FROM ubuntu:${UBUNTU_VERSION} + +LABEL maintainer="https://github.com/dzynetech" ARG PYTHON_VERSION=3.9 -ARG OPENCV_VERSION=4.6.0 +ARG OPENCV_VERSION=4.9.0 # Needed for string substitution SHELL ["/bin/bash", "-c"] # https://techoverflow.net/2019/05/18/how-to-fix-configuring-tzdata-interactive-input-when-building-docker-images/ -ENV DEBIAN_FRONTEND=noninteractive -ENV TZ=Europe/Prague +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=Europe/Prague + RUN \ # add sources for older pythons - apt-get update --fix-missing && \ + apt-get update -q --fix-missing && \ apt-get install -y --no-install-recommends software-properties-common && \ - add-apt-repository ppa:deadsnakes/ppa && \ + if [[ "$PYTHON_VERSION" =~ ^(2.7|3.6|3.7)$ ]]; then \ + add-apt-repository ppa:deadsnakes/ppa ; \ + fi && \ apt-add-repository universe && \ apt-get -y update -qq --fix-missing && \ apt-get -y install --no-install-recommends \ python${PYTHON_VERSION} \ python${PYTHON_VERSION}-dev \ $( [ ${PYTHON_VERSION%%.*} -ge 3 ] && echo "python${PYTHON_VERSION}-distutils" ) \ + curl \ wget \ && \ + rm -rf /var/lib/apt/lists/* && \ # Set the default python and install PIP packages update-alternatives --install /usr/bin/python${PYTHON_VERSION%%.*} python${PYTHON_VERSION%%.*} /usr/bin/python${PYTHON_VERSION} 1 && \ @@ -34,12 +41,8 @@ RUN \ # install python dependencies # sysctl -w net.ipv4.ip_forward=1 ; \ - if [[ "$PYTHON_VERSION" == "2.7" || "$PYTHON_VERSION" == "3.6" ]]; then \ - wget https://bootstrap.pypa.io/pip/$PYTHON_VERSION/get-pip.py --progress=bar:force:noscroll --no-check-certificate ; \ - else \ - apt-get -y install --no-install-recommends python${PYTHON_VERSION}-distutils ; \ - wget https://bootstrap.pypa.io/get-pip.py --progress=bar:force:noscroll --no-check-certificate ; \ - fi && \ + apt-get -y install --no-install-recommends python${PYTHON_VERSION}-distutils ; \ + wget https://bootstrap.pypa.io/get-pip.py --progress=bar:force:noscroll --no-check-certificate ; \ python${PYTHON_VERSION} get-pip.py && \ rm get-pip.py @@ -52,30 +55,24 @@ RUN \ unzip \ cmake \ ffmpeg \ - libtbb2 \ + $( [ "$UBUNTU_VERSION" = "20.04" ] && libtbb2 || libtbb12 ) \ gfortran \ apt-utils \ pkg-config \ checkinstall \ - qt5-default \ + qtbase5-dev qt5-qmake \ build-essential \ libopenblas-base \ libopenblas-dev \ liblapack-dev \ libatlas-base-dev \ - #libgtk-3-dev \ - #libavcodec58 \ libavcodec-dev \ - #libavformat58 \ libavformat-dev \ libavutil-dev \ - #libswscale5 \ libswscale-dev \ libjpeg8-dev \ libpng-dev \ libtiff5-dev \ - #libdc1394-22 \ - libdc1394-22-dev \ libxine2-dev \ libv4l-dev \ libgstreamer1.0 \ @@ -91,7 +88,7 @@ RUN \ libxext6 \ libxrender1 \ && \ - pip${PYTHON_VERSION} install numpy && \ + pip install numpy && \ # Install OpenCV wget https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip -O opencv.zip --progress=bar:force:noscroll --no-check-certificate && \ @@ -151,7 +148,6 @@ RUN \ libopenblas-dev \ liblapack-dev \ libatlas-base-dev \ - #libgtk-3-dev \ libavcodec-dev \ libavformat-dev \ libavutil-dev \ @@ -159,7 +155,6 @@ RUN \ libjpeg8-dev \ libpng-dev \ libtiff5-dev \ - libdc1394-22-dev \ libxine2-dev \ libv4l-dev \ libgstreamer1.0-dev \ @@ -167,15 +162,16 @@ RUN \ libglew-dev \ libpostproc-dev \ libeigen3-dev \ - libtbb-dev \ zlib1g-dev \ && \ apt-get autoremove -y && \ apt-get clean && \ - rm -rf /opencv /opencv_contrib /var/lib/apt/lists/* && \ + rm -rf /opencv /opencv_contrib /var/lib/apt/lists/* -# Call default command. +RUN \ + # Call default command. ffmpeg -version && \ #ldd `which ffmpeg` && \ python --version && \ + pip list && \ python -c "import cv2 ; print(cv2.__version__)" diff --git a/gpu/Dockerfile b/gpu/Dockerfile index 50d0704..17cbf7e 100644 --- a/gpu/Dockerfile +++ b/gpu/Dockerfile @@ -5,20 +5,21 @@ # CALL: docker image build -t python-opencv-ffmpeg:py36 -f cpu/Dockerfile --build-arg PYTHON_VERSION=3.6 . -ARG CUDA_VERSION=11.4.0 +ARG CUDA_VERSION=11.8.0 +ARG UBUNTU_VERSION=22.04 -FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04 +FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION} -LABEL maintainer="https://github.com/Borda" +LABEL maintainer="https://github.com/dzynetech" ARG PYTHON_VERSION=3.9 -ARG OPENCV_VERSION=4.6.0 +ARG OPENCV_VERSION=4.9.0 # Needed for string substitution SHELL ["/bin/bash", "-c"] # https://techoverflow.net/2019/05/18/how-to-fix-configuring-tzdata-interactive-input-when-building-docker-images/ -ENV DEBIAN_FRONTEND=noninteractive -ENV TZ=Europe/Prague +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=Europe/Prague # ENV LD_LIBRARY_PATH /usr/local/${CUDA}/compat:$LD_LIBRARY_PATH @@ -26,15 +27,19 @@ RUN \ # add sources for older pythons apt-get update -qq --fix-missing && \ apt-get install -y --no-install-recommends software-properties-common && \ - add-apt-repository ppa:deadsnakes/ppa && \ + if [[ "$PYTHON_VERSION" =~ ^(2.7|3.6|3.7)$ ]]; then \ + add-apt-repository ppa:deadsnakes/ppa ; \ + fi && \ apt-add-repository universe && \ apt-get -y update -qq --fix-missing && \ apt-get -y install --no-install-recommends \ python${PYTHON_VERSION} \ python${PYTHON_VERSION}-dev \ $( [ ${PYTHON_VERSION%%.*} -ge 3 ] && echo "python${PYTHON_VERSION}-distutils" ) \ + curl \ wget \ && \ + rm -rf /var/lib/apt/lists/* && \ # Set the default python and install PIP packages update-alternatives --install /usr/bin/python${PYTHON_VERSION%%.*} python${PYTHON_VERSION%%.*} /usr/bin/python${PYTHON_VERSION} 1 && \ @@ -42,12 +47,8 @@ RUN \ # install python dependencies # sysctl -w net.ipv4.ip_forward=1 ; \ - if [[ "$PYTHON_VERSION" == "2.7" || "$PYTHON_VERSION" == "3.6" ]]; then \ - wget https://bootstrap.pypa.io/pip/$PYTHON_VERSION/get-pip.py --progress=bar:force:noscroll --no-check-certificate ; \ - else \ - apt-get -y install --no-install-recommends python${PYTHON_VERSION}-distutils ; \ - wget https://bootstrap.pypa.io/get-pip.py --progress=bar:force:noscroll --no-check-certificate ; \ - fi && \ + apt-get -y install --no-install-recommends python${PYTHON_VERSION}-distutils ; \ + wget https://bootstrap.pypa.io/get-pip.py --progress=bar:force:noscroll --no-check-certificate ; \ python${PYTHON_VERSION} get-pip.py && \ rm get-pip.py @@ -66,30 +67,24 @@ RUN \ unzip \ cmake \ ffmpeg \ - libtbb2 \ + $( [ "$UBUNTU_VERSION" = "20.04" ] && libtbb2 || libtbb12 ) \ gfortran \ apt-utils \ pkg-config \ checkinstall \ - qt5-default \ + qtbase5-dev qt5-qmake \ build-essential \ libopenblas-base \ libopenblas-dev \ liblapack-dev \ libatlas-base-dev \ - #libgtk-3-dev \ - #libavcodec58 \ libavcodec-dev \ - #libavformat58 \ libavformat-dev \ libavutil-dev \ - #libswscale5 \ libswscale-dev \ libjpeg8-dev \ libpng-dev \ libtiff5-dev \ - #libdc1394-22 \ - libdc1394-22-dev \ libxine2-dev \ libv4l-dev \ libgstreamer1.0 \ @@ -105,7 +100,7 @@ RUN \ libxext6 \ libxrender1 \ && \ - pip${PYTHON_VERSION} install numpy && \ + pip install numpy && \ # Install OpenCV wget https://github.com/opencv/opencv/archive/$OPENCV_VERSION.zip -O opencv.zip --progress=bar:force:noscroll && \ @@ -176,7 +171,6 @@ RUN \ libopenblas-dev \ liblapack-dev \ libatlas-base-dev \ - #libgtk-3-dev \ libavcodec-dev \ libavformat-dev \ libavutil-dev \ @@ -184,7 +178,6 @@ RUN \ libjpeg8-dev \ libpng-dev \ libtiff5-dev \ - libdc1394-22-dev \ libxine2-dev \ libv4l-dev \ libgstreamer1.0-dev \ @@ -192,15 +185,16 @@ RUN \ libglew-dev \ libpostproc-dev \ libeigen3-dev \ - libtbb-dev \ zlib1g-dev \ && \ apt-get autoremove -y && \ apt-get clean && \ - rm -rf /opencv /opencv_contrib /var/lib/apt/lists/* && \ + rm -rf /opencv /opencv_contrib /var/lib/apt/lists/* -# Call default command. +RUN \ + # Call default command. ffmpeg -version && \ #ldd `which ffmpeg` && \ python --version && \ + pip list && \ python -c "import cv2 ; print(cv2.__version__)"