docker-compose中的Python与具有相同图像的独立容器之间存在差异

时间:2017-07-15 19:15:39

标签: python-2.7 docker docker-compose dockerfile python-import

在我的项目中,我有一个基于ubuntu的dockerized微服务:trusty我想从标准的apt-get 2.7.6版本更新到python 2.7.13。在这样做时,我遇到了一些模块导入问题。从那时起,我已经添加到我的pythonpath python2.7/dist-packages的开头,它包含了我所关注的所有模块。

我使用docker-compose build构建了我的微服务图像,但问题是:当我运行docker-compose up时,这个微服务无法导入所有非标准模块,但当我从同一个模块创建自己的容器时使用docker run -it image_id /bin/bash然后运行python shell并导入任何所述模块的图像,一切都很完美。即使我运行相同的python脚本,它也会通过所有这些import语句(但由于没有正确链接而单独运行会导致其他问题失败)。

我断言python 2.7.13正在docker-compose up上运行,当我运行自己的容器时。我已经清除了所有容器,图像和缓存,并且没有进展就重建了。在docker文件末尾运行的命令是CMD python /filename/file.py

任何可能导致这种差异的想法?

编辑: 根据要求,这是Dockerfile。文件结构只是一个带有子文件夹的项目文件夹,每个子文件夹都是自己的dockerized微服务。这里关注的一个叫做document_analyzer,以下是docker-compose文件的相关部分。未正确安装的文件示例是PyPDF2,pymongo,boto3。

FROM ubuntu:trusty

# Built using PyImageSearch guide: 
# http://www.pyimagesearch.com/2015/06/22/install-opencv-3-0-and-python-2-7-on-ubuntu/

# Install dependencies
RUN \ 
    apt-get -qq update && apt-get -qq upgrade -y && \
    apt-get -qq install -y \
        wget \
        unzip \
        libtbb2 \
        libtbb-dev && \
    apt-get -qq install -y \
        build-essential \ 
        cmake \
        git \
        pkg-config \
        libjpeg8-dev \
        libtiff4-dev \
        libjasper-dev \
        libpng12-dev \
        libgtk2.0-dev \
        libavcodec-dev \
        libavformat-dev \
        libswscale-dev \
        libv4l-dev \
        libatlas-base-dev \
        gfortran \
        libhdf5-dev \
        libreadline-gplv2-dev \
        libncursesw5-dev \
        libssl-dev \
        libsqlite3-dev \
        tk-dev \
        libgdbm-dev \
        libc6-dev \
        libbz2-dev \
        libxml2-dev \
        libxslt-dev && \ 

    wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz && \
    tar -xvf Python-2.7.13.tgz && \
    cd Python-2.7.13 && \
    ./configure && \
    make && \
    make install && \
    apt-get install -y python-dev python-setuptools && \
    easy_install pip && \
    pip install numpy==1.12.0 && \

    apt-get autoclean && apt-get clean && \

    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*


# Download OpenCV 3.2.0 and install
# step 10 
RUN \
    cd ~ && \
    wget https://github.com/Itseez/opencv/archive/3.2.0.zip && \
    unzip 3.2.0.zip && \
    mv ~/opencv-3.2.0/ ~/opencv/ && \
    rm -rf ~/3.2.0.zip && \

    cd ~ && \
    wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip -O 3.2.0-contrib.zip && \
    unzip 3.2.0-contrib.zip && \
    mv opencv_contrib-3.2.0 opencv_contrib && \
    rm -rf ~/3.2.0-contrib.zip && \

    cd /root/opencv && \
    mkdir build && \
    cd build && \
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D INSTALL_C_EXAMPLES=OFF \
        -D INSTALL_PYTHON_EXAMPLES=ON \
        -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
        -D BUILD_EXAMPLES=ON .. && \

    cd ~/opencv/build && \
    make -j $(nproc) && \
    make install && \
    ldconfig && \

    # clean opencv repos
    rm -rf ~/opencv/build && \
    rm -rf ~/opencv/3rdparty && \
    rm -rf ~/opencv/doc && \
    rm -rf ~/opencv/include && \
    rm -rf ~/opencv/platforms && \
    rm -rf ~/opencv/modules && \
    rm -rf ~/opencv_contrib/build && \
    rm -rf ~/opencv_contrib/doc



RUN mkdir ~/.aws/ && touch ~/.aws/config && touch ~/.aws/credentials && \
    echo "[default]" > ~/.aws/credentials && \
    echo "AWS_ACCESS_KEY_ID=xxxxxxx" >> ~/.aws/credentials && \
    echo "AWS_SECRET_ACCESS_KEY=xxxxxxx" >> ~/.aws/credentials && \ 

    echo "[default]" > ~/.aws/config && \
    echo "output = json" >> ~/.aws/config && \
    echo "region = us-east-1" >> ~/.aws/config

RUN apt-get update && \
    apt-get -y install bcrypt \
                                libssl-dev \
                                libffi-dev \
                                libpq-dev \
                                vim \
                                redis-server \
                                rsyslog \
                                imagemagick \
                                libmagickcore-dev \
                                libmagickwand-dev \
                                libmagic-dev \
                                curl 

RUN pip install pyopenssl ndg-httpsclient pyasn1

WORKDIR /document_analyzer

# Add requirements and install
COPY . /document_analyzer

RUN pip install -r /document_analyzer/requirements.txt && \
    pip install -Iv https://pypi.python.org/packages/f5/1f/2d7579a6d8409a61b6b8e84ed02ca9efae8b51fd6228e24be88588fac255/tika-1.14.1.tar.gz#md5=aa7d77a4215e252f60243d423946de8d && \
    pip install awscli
ENV PYTHONPATH="/usr/local/lib/python2.7/dist-packages/:${PYTHONPATH}"

CMD python /document_analyzer/api.py

多克尔-撰写:

document_analyzer:
    environment:
      - IP=${IP}
    extends:
      file: common.yml
      service: microservice
    build: document_analyzer
    ports:
      - "5001:5001"
    volumes:
      - ./document_analyzer:/document_analyzer
      - .:/var/lib/
    environment:
        - PYTHONPATH=$PYTHONPATH:/var/lib
    links:
        - redis
        - rabbit
        - ocr_runner
        - tika
        - document_envelope
        - converter
    restart: on-failure

1 个答案:

答案 0 :(得分:1)

您在构建阶段完成了这项工作:

WORKDIR /document_analyzer

# Add requirements and install
COPY . /document_analyzer

RUN pip install -r /document_analyzer/requirements.txt && \
    pip install -Iv https://pypi.python.org/packages/f5/1f/2d7579a6d8409a61b6b8e84ed02ca9efae8b51fd6228e24be88588fac255/tika-1.14.1.tar.gz#md5=aa7d77a4215e252f60243d423946de8d && \
    pip install awscli

在运行时,您可以在撰写yaml文件中执行此操作:

volumes:
  - ./document_analyzer:/document_analyzer

该卷安装将覆盖您在构建期间在/document_analyzer中执行的所有操作。现在只有容器外的目录中的内容可以在容器内的/document_analyzer处获得。从构建阶段开始,/document_analyzer之前的任何内容现在都被此安装隐藏,并且不可用。

使用docker run时的区别在于您没有创建此挂载。