我对Docker和Python应用程序有点新鲜。我遇到了一个非常令人困惑的问题,经过一些按钮推动后,我奇迹般地解决了它。但是,我既不了解问题也不了解解决方案,并且想要理解这两者。
所以我在我的应用程序的根目录中有一个Dockerfile,它执行类似这样的操作:
COPY . .
RUN apt-get update && apt-get install -y enchant \
&& pip install --extra-index-url=${ARTIFACTORY} --no-cache-dir requirements.txt \
&& pip install . \ # installs my python app using setup.py
&& python -m app.run_model
ENTRYPOINT ...
由于磁盘空间不足,因此一直失败。好的,很好,我删除了旧的,未使用的图像。但我不认为这是问题,因为它一直在失败,并且还产生了这些超长,超奇怪的递归文件名,如:
/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/tmp/pip-fih7z5-build/...
在Docker命令周围添加以下包装以某种方式工作:
COPY . /workdir
RUN cd /workdir \
...
&& rm -rf /workdir
要完成安装阶段(虽然现在看起来应用程序进程仍然失败。)我不确定/正在进行什么。有没有人有任何见解?我最好的猜测是两个pip install
以某种方式创造了某种递归的噩梦?
我的setup.py
非常标准,我认为:
#!/usr/bin/env python
from glob import glob
from os.path import abspath, basename, dirname, join, splitext
from setuptools import find_packages, setup
here = abspath(dirname(__file__))
with open(join(here, 'README.md')) as f:
long_description = f.read()
setup(
...
packages=find_packages('src'),
package_dir={'': 'src'},
py_modules=[splitext(basename(path))[0] for path in glob('src/*.py')],
zip_safe=False,
include_package_data=True,
install_requires=[
'scikit-learn==0.18.1',
'scipy==0.19.1',
'nltk==3.2.3',
'requests==2.17.3',
'jsonschema==2.6.0',
'pandas==0.20.1',
'numpy==1.13.0',
'textblob==0.12.0',
'textstat==0.3.1',
'langdetect==1.0.7',
'unidecode==0.4.20',
'Flask==0.12.1',
'Flask-Env==1.0.1',
'pyenchant==1.6.11'
],
setup_requires=[
'flake8==3.3.0',
],
tests_require=[],
)
```