首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地将代码安装到docker中以进行开发

如何正确地将代码安装到docker中以进行开发
EN

Stack Overflow用户
提问于 2019-10-22 11:31:52
回答 2查看 1.7K关注 0票数 4

我在码头容器中开发了一个烧瓶应用程序。我的代码的一个最小示例具有以下结构:

代码语言:javascript
复制
+- myproject
   +- Flask-App
      +- src
         +- __init__.py
      +-__init__.py
      +- Dockerfile
      +- requirements.txt
      +- wsgi.py
+- docker-compose.yml

I使示例更加简约(参见第二次编辑)

由于我目前正在开发应用程序,所以我希望将src作为卷添加到容器中。在没有安装音量的情况下,我每次都要重建容器。每当我添加卷时,就会引发此错误:

代码语言:javascript
复制
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

代码语言:javascript
复制
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 error

Flask-App/wsgi.py

代码语言:javascript
复制
from src import create_app

app = create_app()

if __name__ == '__main__':
   app.run(host='0.0.0.0', port=5000)

Flask-App/requirements.txt

代码语言:javascript
复制
Flask==1.1.1

Flask-App/Dockerfile

代码语言:javascript
复制
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

代码语言:javascript
复制
from flask import Flask


def create_app():

    app = Flask(__name__)

    @app.route('/')
    def index():
        return "Hello World"

    return app

编辑1

Flask-App/Dockerfile

代码语言:javascript
复制
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输出

代码语言:javascript
复制
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

好吧,我把它变得更简约了。这个例子根本不需要烧瓶。当我挂载卷时,程序再次引发一个错误。

代码语言:javascript
复制
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

代码语言:javascript
复制
version: '3'

services:
  flask:
    build:
      context: ./Flask-App
    volumes:
      - ./Flask-App/src:/usr/src/app/sr

Flask-App/src/__init__.py

代码语言:javascript
复制
class MyTest:

    def my_print_fnc(self):
        print("Hello World")


def create_app():
    return MyTest()

Flask-App/app.py (取代wsgi.py)

代码语言:javascript
复制
from src import create_app

app = create_app()

if __name__ == '__main__':
    app.my_print_fnc()

Flask-App/Dockerfile

代码语言:javascript
复制
FROM python:3.7.3-stretch

COPY . /usr/src/app

WORKDIR /usr/src/app


# Run the application
ENTRYPOINT ["python", "app.py"]

docker-compose.yml

代码语言:javascript
复制
version: '3'

services:
  flask:
    build:
      context: ./Flask-App
    volumes:
      - ./Flask-App/src:/usr/src/app/src
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-23 14:13:59

我终于找到了我的代码的问题。它在Flask-App/Dockerfile里。复制命令不考虑WORKDIR

Flask-App/Dockerfile

代码语言:javascript
复制
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

代码语言:javascript
复制
version: '3.1'

services:
  flask:
    build:
      context: ./Flask-App
      dockerfile: Dockerfile
    container_name: flask
    ports:
     - "5000:5000"
    volumes:
      - "./Flask-App/src/:/home/appuser/src"
票数 1
EN

Stack Overflow用户

发布于 2019-10-22 12:11:08

您的docker-compose.yml文件有一个问题,尤其是您安装卷的方式。将其改为:

代码语言:javascript
复制
volumes: :
      - './Flask-App:/home/appuser'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58503308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档