我正在尝试在Docker容器中启动一个简单的Flask“ Hello world”应用程序,但我不断收到此错误:“ OSError:[Errno 8] Exec格式错误:'/ app / app.py'” >
我的主机操作系统是Windows 10。
我的Dockerfile:
FROM python:3.6
ENV PYTHONBUFFERED 1
ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
我有Requirements.txt,其中Flask == 1.0.2。
app.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
和docker-compose.yml:
version: '3'
services:
app:
build: .
command: python app.py
ports:
- "8000:8000"
容器的整个日志:
app_1 | * Serving Flask app "app" (lazy loading)
app_1 | * Environment: production
app_1 | WARNING: Do not use the development server in a production environment.
app_1 | Use a production WSGI server instead.
app_1 | * Debug mode: on
app_1 | * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
app_1 | * Restarting with stat
app_1 | Traceback (most recent call last):
app_1 | File "app.py", line 9, in <module>
app_1 | app.run(host='0.0.0.0', port=8000, debug=True)
app_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 943, in run
app_1 | run_simple(host, port, self, **options)
app_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 988, in run_simple
app_1 | run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
app_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
app_1 | sys.exit(reloader.restart_with_reloader())
app_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
app_1 | exit_code = subprocess.call(args, env=new_environ, close_fds=False)
app_1 | File "/usr/local/lib/python3.6/subprocess.py", line 287, in call
app_1 | with Popen(*popenargs, **kwargs) as p:
app_1 | File "/usr/local/lib/python3.6/subprocess.py", line 729, in __init__
app_1 | restore_signals, start_new_session)
app_1 | File "/usr/local/lib/python3.6/subprocess.py", line 1364, in _execute_child
app_1 | raise child_exception_type(errno_num, err_msg, err_filename)
app_1 | OSError: [Errno 8] Exec format error: '/app/app.py'
flaskdockerproject_app_1 exited with code 1
更新
我在app.py中添加了shebang之后,就像@larsks说的那样,我收到此错误: “ FileNotFoundError:[错误2]没有这样的文件或目录:'/app/app.py':'/app/app.py'。
所有文件都在容器中的正确位置。
答案 0 :(得分:10)
我遇到了同样的问题(Exec格式错误,如果我添加了shebang,则为FileNotFound)。
在Dockerfile中添加“ RUN chmod 644 app.py”已为我修复,如此处所述:https://github.com/pallets/werkzeug/issues/1482
答案 1 :(得分:3)
昨天花了整整一天的时间逐个讨论这个问题,所以我想分享一个更详细的答案。构建图像时,我还看到以下警告消息:
安全警告:您正在Windows上针对非Windows Docker主机构建Docker映像。
“添加了该警告,因为Windows文件系统没有将文件标记为“可执行”的选项。因此,如果必须将文件标记为可执行文件,则从Windows计算机构建Linux映像将破坏该映像。 -https://github.com/moby/moby/issues/20397
因此,正如Richard Chamberlain在上面的评论中指出的那样,添加“ RUN chmod 644.py”可确保正确标记app.py文件。
将所有内容放在一起,这是为我工作的完整Dockerfile-真的希望它能帮助下一个在此问题上苦苦挣扎的人!
FROM python:3.7-alpine
COPY . /app
WORKDIR /app
RUN apk add --no-cache --virtual .build-deps \
ca-certificates gcc postgresql-dev linux-headers musl-dev \
libffi-dev jpeg-dev zlib-dev \
&& pip install --no-cache -r requirements.txt
RUN chmod 644 app.py
CMD ["python","app.py"]