我在码头容器中开发了一个烧瓶应用程序。我的代码的一个最小示例具有以下结构:
+- myproject
+- Flask-App
+- src
+- __init__.py
+-__init__.py
+- Dockerfile
+- requirements.txt
+- wsgi.py
+- docker-compose.ymlI使示例更加简约(参见第二次编辑)
由于我目前正在开发应用程序,所以我希望将src作为卷添加到容器中。在没有安装音量的情况下,我每次都要重建容器。每当我添加卷时,就会引发此错误:
Attaching to flask
flask | Traceback (most recent call last):
flask | File "wsgi.py", line 1, in <module>
flask | from src import create_app
flask | ImportError: cannot import name 'create_app' from 'src' (unknown location)
flask exited with code 1如果在volume中没有docker-compose.yml命令,代码就会运行。你能解释一下我怎样才能避开这个问题吗?
docker-compose.yml
version: '3.1'
services:
flask:
build:
context: ./Flask-App
dockerfile: Dockerfile
container_name: flask
ports:
- "5000:5000"
volumes: # produces error
- ./src/:/home/appuser/src/ # produces errorFlask-App/wsgi.py
from src import create_app
app = create_app()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)Flask-App/requirements.txt
Flask==1.1.1Flask-App/Dockerfile
FROM python:3.7.3-stretch
COPY ./requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
RUN useradd --home /home/appuser appuser
WORKDIR /home/appuser
USER appuser
COPY ./ ./
# Run the application
ENTRYPOINT ["python"]
CMD ["wsgi.py"]Flask-App/src/__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/')
def index():
return "Hello World"
return app编辑1
Flask-App/Dockerfile
FROM python:3.7.3-stretch
COPY ./requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
RUN useradd --home /home/appuser appuser
WORKDIR /home/appuser
USER appuser
COPY ./ ./
RUN echo $(ls -alt /home/appuser) # newly added
# Run the application
ENTRYPOINT ["python"]
CMD ["wsgi.py"]echo ls的输出
total 24
drwxr-xr-x 1 root root 4096 Oct 22 11:55 .
-rwxr-xr-x 1 root root 345 Oct 22 11:55 Dockerfile
-rwxr-xr-x 1 root root 117 Oct 22 11:25 wsgi.py
-rwxr-xr-x 1 root root 0 Oct 22 11:17 __init__.py
drwxr-xr-x 2 root root 4096 Oct 22 11:17 src
drwxr-xr-x 1 root root 4096 Oct 21 11:15 ..
-rwxr-xr-x 1 root root 12 Oct 21 11:14 requirements.txt编辑2
好吧,我把它变得更简约了。这个例子根本不需要烧瓶。当我挂载卷时,程序再次引发一个错误。
flask_1 | Traceback (most recent call last):
flask_1 | File "app.py", line 1, in <module>
flask_1 | from src import create_app
flask_1 | ImportError: cannot import name 'create_app' from 'src' (unknown location)下面,我再次添加了所有文件来重现错误。
docker-compose.yml
version: '3'
services:
flask:
build:
context: ./Flask-App
volumes:
- ./Flask-App/src:/usr/src/app/srFlask-App/src/__init__.py
class MyTest:
def my_print_fnc(self):
print("Hello World")
def create_app():
return MyTest()Flask-App/app.py (取代wsgi.py)
from src import create_app
app = create_app()
if __name__ == '__main__':
app.my_print_fnc()Flask-App/Dockerfile
FROM python:3.7.3-stretch
COPY . /usr/src/app
WORKDIR /usr/src/app
# Run the application
ENTRYPOINT ["python", "app.py"]docker-compose.yml
version: '3'
services:
flask:
build:
context: ./Flask-App
volumes:
- ./Flask-App/src:/usr/src/app/src发布于 2019-10-23 14:13:59
我终于找到了我的代码的问题。它在Flask-App/Dockerfile里。复制命令不考虑WORKDIR。
Flask-App/Dockerfile
FROM python:3.7.3-stretch
COPY ./requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
RUN useradd --home /home/appuser appuser
WORKDIR /home/appuser
USER appuser
COPY . /home/appuser # <- specify the absolute path
# Run the application
ENTRYPOINT ["python"]
CMD ["wsgi.py"]docker-compose.yml
version: '3.1'
services:
flask:
build:
context: ./Flask-App
dockerfile: Dockerfile
container_name: flask
ports:
- "5000:5000"
volumes:
- "./Flask-App/src/:/home/appuser/src"发布于 2019-10-22 12:11:08
您的docker-compose.yml文件有一个问题,尤其是您安装卷的方式。将其改为:
volumes: :
- './Flask-App:/home/appuser'https://stackoverflow.com/questions/58503308
复制相似问题