【问题标题】:Docker run Flask ImportError: No Module Named FlaskDocker 运行 Flask ImportError: No Module Named Flask
【发布时间】:2021-07-20 19:11:19
【问题描述】:

我正在努力完成我的学校作业,即:

  1. 分叉https://github.com/aaronjolson/flask-pytest-example
  2. 编写 Jenkinsfile、Dockerfile -> 在您的 dockerhub 存储库中生成一个新标签
  3. 拉码头
  4. 构建泊坞窗
  5. 运行泊坞窗
  6. curl localhost:5000 查看结果

目前我处于第 5 阶段,尝试运行 docker 映像时出现此错误:

Traceback (most recent call last):

File "app.py", line 1, in <module>

from flask import Flask

ImportError: No module named flask

配置:

  1. Jenkins 正在开发 Debian 9
  2. 使用适用于 Windows 的 Docker 客户端拉取和运行 Docker 映像
  3. Jenkins 文件:
it@debian:~/flask-pytest-example$ cat Jenkinsfile
pipeline {
    environment {
        registry = "tslaceo/flask-pytest"
        imageName = 'flask-pytest'
        registryCred = 'tslaceo'
        gitProject = "https://github.com/tslaceo/flask-pytest-example.git"
    }
    agent any
    options {
        timeout(time: 1, unit: 'HOURS')
    }
    stages {
        stage ('preparation') {
            steps {
                deleteDir()
            }
        }
        stage ('get src from git') {
            steps {
                git 'https://github.com/tslaceo/flask-pytest-example.git'
            }
        }
        stage ('build docker') {
            steps {
                script {
                    dockerImage = docker.build registry + ":$BUILD_NUMBER"
                }
            }
        }
        stage ('docker publish') {
            steps {
                script {
                    docker.withRegistry( '', registryCred ) {
                        dockerImage.push()
                    }
                }
            }
        }
        stage ('cleaning') {
            steps {
                sh "docker rmi $registry:$BUILD_NUMBER"
            }
        }
    }
}

  1. Dockerfile:
it@debian:~/flask-pytest-example$ cat Dockerfile
FROM python
WORKDIR /flask-pytest-example
RUN python --version
RUN pip freeze > requirements.txt
RUN pip install --upgrade pip && pip install -r requirements.txt
COPY . .
CMD ["python", "-u", "app.py"]
  1. requirements.txt
it@debian:~/flask-pytest-example$ cat requirements.txt
flask
pytest
  1. ls -la
it@debian:~/flask-pytest-example$ ls -la
total 52
drwxr-xr-x  5 it it 4096 Apr 27 15:28 .
drwxr-xr-x 19 it it 4096 Apr 27 14:42 ..
-rw-r--r--  1 it it  178 Apr 27 10:32 app.py
-rw-r--r--  1 it it  202 Apr 27 15:06 Dockerfile
-rw-r--r--  1 it it  152 Apr 27 12:39 Dockerfile.save
drwxr-xr-x  8 it it 4096 Apr 27 15:06 .git
-rw-r--r--  1 it it   38 Apr 27 10:32 .gitignore
drwxr-xr-x  2 it it 4096 Apr 27 10:32 handlers
-rw-r--r--  1 it it    0 Apr 27 10:32 __init__.py
-rw-r--r--  1 it it 1147 Apr 27 10:48 Jenkinsfile
-rw-r--r--  1 it it 1071 Apr 27 10:32 LICENSE
-rw-r--r--  1 it it  491 Apr 27 10:32 README.md
-rw-r--r--  1 it it   13 Apr 27 10:32 requirements.txt
drwxr-xr-x  2 it it 4096 Apr 27 10:32 tests

【问题讨论】:

    标签: python docker flask jenkins-pipeline pytest


    【解决方案1】:

    删除RUN pip freeze ... 行;将其替换为 COPY requirements.txt . 以获取该文件的副本,该副本已与您的应用程序的其余部分一起签入。

    你展示的Dockerfile中的流程是

    1. 从干净、空的 Python 安装开始;
    2. 列出那里安装的所有包(即没有)并写入requirements.txt;
    3. 安装requirements.txt 中列出的所有包(即不安装任何包)。

    requirements.txt 文件应作为应用程序源代码的一部分签入,因此如果您将 COPY 签入而不是重新生成它,它将在其中列出包并且它将是包的确切版本您在非 Docker 虚拟环境中进行了测试。


    我可能会将基于 Jenkins 的构建设置作为此序列中的最后一件事。更好的方法可能是:

    1. 使用普通的 Python 虚拟环境构建您的应用程序;没有 Jenkins,没有 Docker。

      python3 -m venv venv
      . venv/bin/activate
      pip install -r requirements.txt
      pytest
      ./app.py
      curl http://localhost:5000
      
    2. 使用上面显示的 Dockerfile 将构建、工作、测试的 Python 应用程序包装在 Docker 容器中。

      docker build -t tslaceo/flask-pytest .
      docker run -p 5000:5000 tslaceo/flask-pytest
      curl http://localhost:5000
      
    3. 在 Jenkins 中封装此设置。

    如果您的应用程序有问题(这是通常的情况),虚拟环境设置将更容易调试,您可以使用普通的编辑器、IDE、调试器、等等。 无需任何特殊设置。如果您的打包有问题,那么在本地运行 docker build 将再次比尝试在 CI 环境中重现它更容易调试和调整。

    【讨论】:

    • 你是对的。我已经想通了。当 .py 文件要导入模块时,源代码中有一个错误(?)。修复:从/flask-pytest-example/handlers/routes.py获取文件并将其复制到根应用程序文件夹中,然后将app.py从from flask_pytest_example.handlers.routes import configure_routes编辑为from routes import configure_routes。
    猜你喜欢
    • 2017-02-20
    • 2019-04-03
    • 2013-06-27
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2021-11-11
    • 2016-04-19
    相关资源
    最近更新 更多