Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “这是什么?”;[Errno 2]没有这样的文件”;使用docker部署时_Python_Docker_Flask - Fatal编程技术网

Python “这是什么?”;[Errno 2]没有这样的文件”;使用docker部署时

Python “这是什么?”;[Errno 2]没有这样的文件”;使用docker部署时,python,docker,flask,Python,Docker,Flask,我在testdriven.io上学习微服务课程。在本课程中,我需要使用Docker部署一个Flask应用程序。要运行应用程序,我使用Flask cli,它在启动时给我一个错误: No such file or directory: '/usr/src/app/manage.py': '/usr/src/app/manage.py' 要部署容器,我使用Docker compose。我在Windows 10计算机上运行该命令,并使用标准Python映像(Python:3.7.2-alpine)。我

我在testdriven.io上学习微服务课程。在本课程中,我需要使用Docker部署一个Flask应用程序。要运行应用程序,我使用Flask cli,它在启动时给我一个错误:

No such file or directory: '/usr/src/app/manage.py': '/usr/src/app/manage.py'
要部署容器,我使用Docker compose。我在Windows 10计算机上运行该命令,并使用标准Python映像(
Python:3.7.2-alpine
)。我已经尝试更改该文件的权限,但没有帮助

以下是我的撰写文件的外观:

version: '3.7'

services:

  users:
    build:
      context: ./services/users
      dockerfile: Dockerfile-dev
    volumes:
      - './services/users:/usr/src/app'
    ports:
      - 6001:6000
    environment:
      - FLASK_APP=project/__init__.py
      - FLASK_ENV=development
      - COMPOSE_CONVERT_WINDOWS_PATHS=1
我的docker文件:

# base image
FROM python:3.7.2-alpine

# set working directory
WORKDIR /usr/src/app

# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

# add app
COPY . /usr/src/app

# i tried to give it the right rights.. but it didn't help
RUN chmod +x /usr/src/app/manage.py

# run server
CMD python manage.py run -h 0.0.0.0
以及将启动应用程序的my
manage.py
文件:

#/usr/bin/python3
#服务/用户/manage.py
从flask.cli导入FlaskGroup
从项目导入应用程序
cli=烧瓶组(应用程序)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
cli()
因此,我希望这会启动应用程序并使其在端口6001上可用,但它会给我以下错误:

Successfully tagged testdriven-app_users:latest
Recreating testdriven-app_users_1 ... done
Attaching to testdriven-app_users_1
users_1  |  * Serving Flask app "project/__init__.py" (lazy loading)
users_1  |  * Environment: development
users_1  |  * Debug mode: on
users_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
users_1  |  * Restarting with stat
users_1  | Traceback (most recent call last):
users_1  |   File "manage.py", line 11, in <module>
users_1  |     cli()
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/core.py", line 764, in __call__
users_1  |     return self.main(*args, **kwargs)
users_1  |   File "/usr/local/lib/python3.7/site-packages/flask/cli.py", line 557, in main
users_1  |     return super(FlaskGroup, self).main(*args, **kwargs)
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/core.py", line 717, in main
users_1  |     rv = self.invoke(ctx)
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
users_1  |     return _process_result(sub_ctx.command.invoke(sub_ctx))
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
users_1  |     return ctx.invoke(self.callback, **ctx.params)
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
users_1  |     return callback(*args, **kwargs)
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/decorators.py", line 64, in new_func
users_1  |     return ctx.invoke(f, obj, *args, **kwargs)
users_1  |   File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
users_1  |     return callback(*args, **kwargs)
users_1  |   File "/usr/local/lib/python3.7/site-packages/flask/cli.py", line 771, in run_command
users_1  |     threaded=with_threads, ssl_context=cert)
users_1  |   File "/usr/local/lib/python3.7/site-packages/werkzeug/serving.py", line 988, in run_simple
users_1  |     run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
users_1  |   File "/usr/local/lib/python3.7/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
users_1  |     sys.exit(reloader.restart_with_reloader())
users_1  |   File "/usr/local/lib/python3.7/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
users_1  |     exit_code = subprocess.call(args, env=new_environ, close_fds=False)
users_1  |   File "/usr/local/lib/python3.7/subprocess.py", line 323, in call
users_1  |     with Popen(*popenargs, **kwargs) as p:
users_1  |   File "/usr/local/lib/python3.7/subprocess.py", line 775, in __init__
users_1  |     restore_signals, start_new_session)
users_1  |   File "/usr/local/lib/python3.7/subprocess.py", line 1522, in _execute_child
users_1  |     raise child_exception_type(errno_num, err_msg, err_filename)
users_1  | FileNotFoundError: [Errno 2] No such file or directory: '/usr/src/app/manage.py': '/usr/src/app/manage.py'
testdriven-app_users_1 exited with code 1
已成功标记testdriven-app_用户:最新
正在重新创建testdriven-app\u用户\u 1。。。完成
连接到testdriven-app_用户_1
用户_1 |*为烧瓶应用程序“project/uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuy.py”(延迟加载)提供服务
用户| 1 |*环境:发展
用户_1 |*调试模式:打开
在上运行的用户_1 |*http://0.0.0.0:5000/ (按CTRL+C退出)
用户_1 |*使用stat重新启动
用户_1 |回溯(最近一次呼叫最后一次):
用户1|文件“manage.py”,第11行,在
用户_1| cli()
用户1 |文件“/usr/local/lib/python3.7/site packages/click/core.py”,第764行,在|调用中__
用户_1|返回self.main(*args,**kwargs)
用户1 |文件“/usr/local/lib/python3.7/site-packages/flask/cli.py”,第557行,主目录
用户1 |返回超级(烧瓶组,自我).main(*args,**kwargs)
用户1 |文件“/usr/local/lib/python3.7/site packages/click/core.py”,主菜单第717行
用户_1 | rv=self.invoke(ctx)
用户1 |文件“/usr/local/lib/python3.7/site packages/click/core.py”,调用中的第1137行
用户1返回进程结果(sub_ctx.command.invoke(sub_ctx))
用户1 |文件“/usr/local/lib/python3.7/site packages/click/core.py”,调用中的第956行
用户_1 |返回ctx.invoke(self.callback,**ctx.params)
用户1 |文件“/usr/local/lib/python3.7/site packages/click/core.py”,调用中的第555行
用户_1|返回回调(*args,**kwargs)
用户1 |文件“/usr/local/lib/python3.7/site packages/click/decorators.py”,第64行,在新函数中
用户_1|返回ctx.invoke(f,obj,*args,**kwargs)
用户1 |文件“/usr/local/lib/python3.7/site packages/click/core.py”,调用中的第555行
用户_1|返回回调(*args,**kwargs)
用户1 |文件“/usr/local/lib/python3.7/site packages/flask/cli.py”,第771行,在run|u命令中
用户_1 |线程=带有_线程,ssl _上下文=证书)
用户1 |文件“/usr/local/lib/python3.7/site packages/werkzeug/service.py”,第988行,运行简单
用户_1 |使用_重载器运行_(内部、额外文件、重载器间隔、重载器类型)
用户1 |文件“/usr/local/lib/python3.7/site packages/werkzeug/_reloader.py”,第332行,运行时使用_reloader
用户_1 |系统退出(使用_reloader()重新启动_)
用户| 1 |文件“/usr/local/lib/python3.7/site packages/werkzeug/_reloader.py”,第176行,使用_reloader重新启动
用户_1|退出_代码=子流程.call(args,env=new_environ,close_fds=False)
用户1 |文件“/usr/local/lib/python3.7/subprocess.py”,第323行,在调用中
以Popen(*popenargs,**kwargs)作为p的用户| 1 |:
用户1 |文件“/usr/local/lib/python3.7/subprocess.py”,第775行,在| init中__
用户_1 |恢复_信号,启动_新_会话)
用户1 |文件“/usr/local/lib/python3.7/subprocess.py”,第1522行,在执行子进程中
用户_1 |引发子项_异常_类型(errno _num、err _msg、err _filename)
用户_1 | FileNotFoundError:[Errno 2]没有这样的文件或目录:'/usr/src/app/manage.py':'/usr/src/app/manage.py'
testdriven-app_用户_1已退出,代码为1

执行脚本时,内核会查找shebang(
#!
)中指定的解释器。提取解释器的位置,然后启动解释器(例如,
python3
),执行脚本本身。如果未找到解释器二进制文件,则执行失败,并出现
无此类文件或目录(
enoint
)错误(根据
man 2 execve
):

因此,即使您的应用程序在本地主机上工作(如果它是Windows,它甚至可能不关心shebang),当您将其移动到Docker容器中时,它也会停止工作

为了避免这种情况,脚本中的shebang通常不是指解释器本身(
#!/usr/bin/python3
),而是指找到并执行解释器的
/usr/bin/env
二进制文件:

#!/usr/bin/env python3
当您通过
env
运行
python3
时,后者通过
路径执行搜索,因此它允许您的shebang不依赖于
python3
二进制文件的特定位置

最后,脚本的正确版本如下所示:

#!/usr/bin/env python3
# services/users/manage.py

from flask.cli import FlaskGroup

from project import app

cli = FlaskGroup(app)

if __name__ == '__main__':
    cli()

将werkzeug==0.14.1添加到requirement.txt可以修复windows上出现的相同错误。
它看起来像一只werkzeug虫子

谢谢你的回答!现在可以了。我还不得不将文件的换行符从CRLF改为LF。这也解决了我的问题。谢谢我的版本是0.15.xx,我刚刚更新了版本并解决了问题。
#!/usr/bin/env python3
#!/usr/bin/env python3
# services/users/manage.py

from flask.cli import FlaskGroup

from project import app

cli = FlaskGroup(app)

if __name__ == '__main__':
    cli()