【问题标题】:Put an existing Flask App in a docker container - pip import problem将现有的 Flask 应用程序放入 docker 容器中 - pip 导入问题
【发布时间】: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

任何建议都将不胜感激。

【问题讨论】:

标签: python python-3.x docker flask pip


【解决方案1】:

基于这个issue,你可以试试这个。因为问题不是来自任何包,而是 Image 缺少依赖项。

对此进行了调查,这基本上取决于建立在 本地操作系统,并且需要一堆东西才能​​做到这一点 - 特别是 安全功能。

将以下内容添加到 alpine 构建将为您提供支持 您需要的组件,但我建议您进行多阶段构建 避免腹胀:

通过添加这些依赖项,无需任何更改即可构建。

FROM python:3.7-alpine3.9

# set the working directory in the container to /app
WORKDIR /app

# add the current directory to the container as /app
ADD . /app
RUN apk add -U --no-cache gcc build-base linux-headers ca-certificates python3-dev libffi-dev libressl-dev libxslt-dev
# 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"]

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多