Docker run Flask ImportError: No Module Named Flask
Docker run Flask ImportError: No Module Named Flask
我正在努力完成我的学校作业,即:
- 分叉https://github.com/aaronjolson/flask-pytest-example
- 编写 Jenkinsfile,Dockerfile -> 在你的 dockerhub repo
上产生一个新标签
- 拉docker
- 建造docker
- 运行 docker
- 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
配置:
- Jenkins 正在开发 Debian 9
- 使用 Docker 客户端为 Windows
提取和 运行 docker 图像
- 詹金斯文件:
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"
}
}
}
}
- Docker文件:
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"]
- requirements.txt
it@debian:~/flask-pytest-example$ cat requirements.txt
flask
pytest
- 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
删除RUN pip freeze ...
行;将其替换为 COPY requirements.txt .
以获取与您的应用程序的其余部分一起签入的该文件的副本。
您显示的Docker文件中的流程是
- 从干净、空的 Python 安装开始;
- 列出那里安装的所有软件包(即什么都没有)并写入
requirements.txt
;
- 安装
requirements.txt
中列出的所有软件包(即什么都不安装)。
requirements.txt
文件应该作为应用程序源代码的一部分签入,因此如果您 COPY
签入而不是重新生成它,它将在其中列出包,并且它将是您在非 Docker 虚拟环境中测试过的软件包的确切版本。
我可能会将基于 Jenkins 的构建设置作为此序列中的最后一件事。更好的方法可能是:
使用普通的 Python 虚拟环境构建您的应用程序;没有詹金斯,没有 Docker.
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
pytest
./app.py
curl http://localhost:5000
使用上面显示的 Docker 文件将构建的、工作的、测试的 Python 应用程序包装在 Docker 容器中。
docker build -t tslaceo/flask-pytest .
docker run -p 5000:5000 tslaceo/flask-pytest
curl http://localhost:5000
在 Jenkins 中包装此设置。
如果您的应用程序有问题(这是常见的情况)虚拟环境设置将更容易调试,您可以使用普通的编辑器、IDE、调试器,等,无需任何特殊设置。如果您的 packaging 有问题,那么 运行 docker build
在本地将再次比尝试在 CI 环境中重现更容易调试和调整.
我正在努力完成我的学校作业,即:
- 分叉https://github.com/aaronjolson/flask-pytest-example
- 编写 Jenkinsfile,Dockerfile -> 在你的 dockerhub repo 上产生一个新标签
- 拉docker
- 建造docker
- 运行 docker
- 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
配置:
- Jenkins 正在开发 Debian 9
- 使用 Docker 客户端为 Windows 提取和 运行 docker 图像
- 詹金斯文件:
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"
}
}
}
}
- Docker文件:
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"]
- requirements.txt
it@debian:~/flask-pytest-example$ cat requirements.txt
flask
pytest
- 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
删除RUN pip freeze ...
行;将其替换为 COPY requirements.txt .
以获取与您的应用程序的其余部分一起签入的该文件的副本。
您显示的Docker文件中的流程是
- 从干净、空的 Python 安装开始;
- 列出那里安装的所有软件包(即什么都没有)并写入
requirements.txt
; - 安装
requirements.txt
中列出的所有软件包(即什么都不安装)。
requirements.txt
文件应该作为应用程序源代码的一部分签入,因此如果您 COPY
签入而不是重新生成它,它将在其中列出包,并且它将是您在非 Docker 虚拟环境中测试过的软件包的确切版本。
我可能会将基于 Jenkins 的构建设置作为此序列中的最后一件事。更好的方法可能是:
使用普通的 Python 虚拟环境构建您的应用程序;没有詹金斯,没有 Docker.
python3 -m venv venv . venv/bin/activate pip install -r requirements.txt pytest ./app.py curl http://localhost:5000
使用上面显示的 Docker 文件将构建的、工作的、测试的 Python 应用程序包装在 Docker 容器中。
docker build -t tslaceo/flask-pytest . docker run -p 5000:5000 tslaceo/flask-pytest curl http://localhost:5000
在 Jenkins 中包装此设置。
如果您的应用程序有问题(这是常见的情况)虚拟环境设置将更容易调试,您可以使用普通的编辑器、IDE、调试器,等,无需任何特殊设置。如果您的 packaging 有问题,那么 运行 docker build
在本地将再次比尝试在 CI 环境中重现更容易调试和调整.