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

在我的项目中,我有一个基于ubuntu的dockerized微服务:我想从标准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创build自己的容器时, docker run -it image_id /bin/bash然后运行一个python shell并导入任何上述模块,一切正常。 甚至当我运行相同的python脚本时,它也会通过所有这些导入语句(但由于没有正确的链接而被隔离运行,所以导致其他问题失败)。

我已经断言python 2.7.13正在docker上运行docker-compose up ,当我运行我自己的容器。 我已经清除了所有的容器,图像和caching,并重build了没有进展。 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 

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

 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 

在构build过程中,卷装载将覆盖您在/document_analyzer中执行的所有操作。 只有容器外的目录中的内容现在将在容器内的/document_analyzer上可用。 无论在/document_analyzer之前,从构build阶段,现在隐藏在这个安装,不可用。

当你使用docker run的区别是你没有创build这个挂载。