一次使用两个docker映像

时间:2018-10-30 12:18:34

标签: docker

我有以下情况。我想将tensorflow用于ML和OpenCV进行某些图像处理。我最近了解了码头工人,并发现TF和OCV都已码头化。我可以轻松拉出图像并运行例如。张量流脚本。有没有办法合并两个码头工人提供的东西?或者在它上面运行。我想写一段使用OpenCV和Tensorflow的代码。有没有办法做到这一点?

或更笼统地说:Docker映像已预安装了python软件包AA。 Docker B具有python软件包BB。如何编写同时使用AA和BB的功能的脚本?

1 个答案:

答案 0 :(得分:2)

真的很简单。使用TF和OpenCV构建自己的docker映像。 Dockerfile示例(基于janza/docker-python3-opencv):

FROM python:3.7
LABEL maintainet="John Doe"

RUN apt-get update && \
        apt-get install -y \
        build-essential \
        cmake \
        git \
        wget \
        unzip \
        yasm \
        pkg-config \
        libswscale-dev \
        libtbb2 \
        libtbb-dev \
        libjpeg-dev \
        libpng-dev \
        libtiff-dev \
        libavformat-dev \
        libpq-dev && \
    pip install numpy && \
    pip install tensorflow

WORKDIR /

ENV OPENCV_VERSION="3.4.2"

RUN wget https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip \
&& unzip ${OPENCV_VERSION}.zip \
&& mkdir /opencv-${OPENCV_VERSION}/cmake_binary \
&& cd /opencv-${OPENCV_VERSION}/cmake_binary \
&& cmake -DBUILD_TIFF=ON \
  -DBUILD_opencv_java=OFF \
  -DWITH_CUDA=OFF \
  -DWITH_OPENGL=ON \
  -DWITH_OPENCL=ON \
  -DWITH_IPP=ON \
  -DWITH_TBB=ON \
  -DWITH_EIGEN=ON \
  -DWITH_V4L=ON \
  -DBUILD_TESTS=OFF \
  -DBUILD_PERF_TESTS=OFF \
  -DCMAKE_BUILD_TYPE=RELEASE \
  -DCMAKE_INSTALL_PREFIX=$(python3.7 -c "import sys; print(sys.prefix)") \
  -DPYTHON_EXECUTABLE=$(which python3.7) \
  -DPYTHON_INCLUDE_DIR=$(python3.7 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
  -DPYTHON_PACKAGES_PATH=$(python3.7 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
  .. \
&& make install \
&& rm /${OPENCV_VERSION}.zip \
&& rm -r /opencv-${OPENCV_VERSION}

当然,我不知道您对此项目的确切要求,并且该Dockerfile很可能对您不起作用。只需根据需要进行调整即可。但是我建议从零开始创建(仅基于某些Linux发行版的已有映像)。然后,您可以完全控制安装了哪些版本的版本,而这些版本没有在第三方图像中经常出现的多余内容(我并不是说它们很糟糕,但是对于人们来说,大多数零件通常都是多余的。)

官方中心中也已经有合并的docker映像: https://hub.docker.com/r/fbcotter/docker-tensorflow-opencv/

如果您再次希望将其分开,我想您可以链接那些图像的运行容器。链接服务的容器可以通过与别名相同的主机名访问,如果未指定别名,则可以使用服务名。但是您必须实现某种逻辑才能使用另一个容器中的另一个程序包(可能是可行的,但又困难又复杂)。

Docker Networking