【发布时间】:2020-01-16 15:08:19
【问题描述】:
我开始使用 docker,我决定尝试“dockerize”我正在构建的烧瓶应用程序。但是当我运行docker build -t test . 时,我得到了下面列出的异常。运行此命令时,我激活了 venv,并且我位于如下所示的目录中:
├── Dockerfile
├── app
│ ├── __init__.py
│ ├── __pycache__
│ ├── config.py
│ ├── requirements.txt
│ ├── routes.py
│ ├── sites
│ ├── siteusers.db
│ ├── static
│ ├── templates
│ └── utils
├── app.py
├── requirements.txt
└── venv
在教程和重置磁盘映像之后,我还清除了缓存,并确保 Mac 的 Docker 桌面安装上没有运行任何内容。
例外:
Step 4/6 : RUN python -m ensurepip --upgrade && pip install --trusted-host pypi.python.org --upgrade setuptools pip && pip install --trusted-host pypi.python.org -r requirements.txt
---> Running in beec1eb50780
Looking in links: /tmp/tmprx9xo2fb
Requirement already up-to-date: setuptools in /usr/local/lib/python3.7/site-packages (41.2.0)
Requirement already up-to-date: pip in /usr/local/lib/python3.7/site-packages (19.2.3)
Requirement already up-to-date: setuptools in /usr/local/lib/python3.7/site-packages (41.2.0)
Requirement already up-to-date: pip in /usr/local/lib/python3.7/site-packages (19.2.3)
Collecting dotenv (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/e2/46/3754073706e31670eed18bfa8a879305b56a471db15f20523c2427b10078/dotenv-0.0.5.tar.gz
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-beb7g339/dotenv/setup.py'"'"'; __file__='"'"'/tmp/pip-install-beb7g339/dotenv/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
cwd: /tmp/pip-install-beb7g339/dotenv/
Complete output (68 lines):
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 154, in save_modules
yield saved
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 194, in setup_context
__import__('setuptools')
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/__init__.py", line 2, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/extension.py", line 5, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/dist.py", line 7, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/command/__init__.py", line 8, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/command/install_scripts.py", line 3, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/pkg_resources.py", line 1518, in <module>
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-beb7g339/dotenv/setup.py", line 23, in <module>
scripts=['scripts/dotenv']
File "/usr/local/lib/python3.7/site-packages/setuptools/__init__.py", line 144, in setup
_install_setup_requires(attrs)
File "/usr/local/lib/python3.7/site-packages/setuptools/__init__.py", line 139, in _install_setup_requires
dist.fetch_build_eggs(dist.setup_requires)
File "/usr/local/lib/python3.7/site-packages/setuptools/dist.py", line 719, in fetch_build_eggs
replace_conflicting=True,
File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 782, in resolve
replace_conflicting=replace_conflicting
File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 1065, in best_match
return self.obtain(req, installer)
File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 1077, in obtain
return installer(requirement)
File "/usr/local/lib/python3.7/site-packages/setuptools/dist.py", line 786, in fetch_build_egg
return cmd.easy_install(req)
File "/usr/local/lib/python3.7/site-packages/setuptools/command/easy_install.py", line 679, in easy_install
return self.install_item(spec, dist.location, tmpdir, deps)
File "/usr/local/lib/python3.7/site-packages/setuptools/command/easy_install.py", line 705, in install_item
dists = self.install_eggs(spec, download, tmpdir)
File "/usr/local/lib/python3.7/site-packages/setuptools/command/easy_install.py", line 890, in install_eggs
return self.build_and_install(setup_script, setup_base)
File "/usr/local/lib/python3.7/site-packages/setuptools/command/easy_install.py", line 1158, in build_and_install
self.run_setup(setup_script, setup_base, args)
File "/usr/local/lib/python3.7/site-packages/setuptools/command/easy_install.py", line 1144, in run_setup
run_setup(setup_script, args)
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 233, in run_setup
with setup_context(setup_dir):
File "/usr/local/lib/python3.7/contextlib.py", line 112, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/local/lib/python3.7/contextlib.py", line 130, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 166, in save_modules
saved_exc.resume()
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 141, in resume
six.reraise(type, exc, self._tb)
File "/usr/local/lib/python3.7/site-packages/setuptools/_vendor/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 154, in save_modules
yield saved
File "/usr/local/lib/python3.7/site-packages/setuptools/sandbox.py", line 194, in setup_context
__import__('setuptools')
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/__init__.py", line 2, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/extension.py", line 5, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/dist.py", line 7, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/command/__init__.py", line 8, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/setuptools/command/install_scripts.py", line 3, in <module>
File "/tmp/easy_install-mj6c1o44/distribute-0.7.3/pkg_resources.py", line 1518, in <module>
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
这是我的需求文件:
argon2-cffi==19.1.0
atomicwrites==1.3.0
attrs==19.1.0
cffi==1.12.3
Click==7.0
Flask==1.1.1
Flask-Login==0.4.1
Flask-SQLAlchemy==2.4.0
Flask-WTF==0.14.2
importlib-metadata==0.19
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
mongoengine==0.18.2
more-itertools==7.2.0
packaging==19.1
passlib==1.7.1
pluggy==0.12.0
py==1.8.0
pycparser==2.19
pymongo==3.9.0
pyparsing==2.4.2
pytest==5.1.2
python-dotenv==0.10.3
six==1.12.0
SQLAlchemy==1.3.8
wcwidth==0.1.7
Werkzeug==0.15.5
WTForms==2.2.1
zipp==0.6.0
这是我当前的,我认为首选的 docker 文件(与基于 ubuntu 的文件相比): 我添加了 ensure pip 命令并根据我找到的旧线程升级 setuptools 和 pip。
# this is an official Python runtime, used as the parent image
FROM python:3.7
# set the working directory in the container to /app
WORKDIR /app
# add the current directory to the container as /app
ADD . /app
# execute everyone's favorite pip command, pip install -r
RUN python -m ensurepip --upgrade && pip install --trusted-host pypi.python.org --upgrade setuptools pip && pip install --trusted-host pypi.python.org -r requirements.txt
# unblock port 80 for the Flask app to run on
EXPOSE 80
# execute the Flask app
CMD ["python", "app.py"]
我已尝试按照以下链接中列出的步骤进行操作:
我已经验证了我的 docker install 工作正常,因为我能够成功完成official Get Started Tutorial
任何建议都将不胜感激。
【问题讨论】:
-
谷歌搜索错误消息发现我this python-dotenv issue建议安装
python-dotenv而不是dotenv。 -
完全不用 venv 或许可以省去一些麻烦。 docker 的想法是每个容器一个应用程序,因此 venv(可能)增加了不必要的额外复杂性。
标签: python python-3.x docker flask pip