Werkzeug: 0.15.0으둜 인해 OSError: [Errno 8] Exec ν˜•μ‹ 였λ₯˜: Windows용 Dockerμ—μ„œ

에 λ§Œλ“  2019λ…„ 03μ›” 21일  Β·  19μ½”λ©˜νŠΈ  Β·  좜처: pallets/werkzeug

μƒˆλ‘œμš΄ 0.15.0은 Windows용 Dockerμ—μ„œ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ ν”Œλž«νΌμ—μ„œ Dockerλ₯Ό μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

Flaskλ₯Ό μ‚¬μš©ν•œ μ΅œμ†Œν•œμ˜ 예.

μ•±.파이

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello, world!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

λ„μ»€νŒŒμΌ

FROM python:3-onbuild
COPY . /usr/src/app
CMD ["python", "app.py"]

μš”κ΅¬ 사항.txt

# Werkzeug==0.14.1
Flask

docker build -t flask_test . λ₯Ό μ‹€ν–‰ν•œ λ‹€μŒ docker run flask_test λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
μ»¨ν…Œμ΄λ„ˆ 였λ₯˜:

Ξ» docker run flask_test
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "app.py", line 11, in <module>
    app.run(debug=True, host='0.0.0.0')
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 943, in run
    run_simple(host, port, self, **options)
  File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 988, in run_simple
    run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
  File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
    sys.exit(reloader.restart_with_reloader())
  File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
    exit_code = subprocess.call(args, env=new_environ, close_fds=False)
  File "/usr/local/lib/python3.6/subprocess.py", line 267, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/local/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/usr/src/app/app.py

requirements.txt μ—μ„œ 첫 번째 μ€„μ˜ 주석 처리λ₯Ό μ œκ±°ν•˜λ©΄ λ‹€μ‹œ λΉŒλ“œν•œ ν›„ μ œλŒ€λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ™μΌν•œ νŠœν† λ¦¬μ–Όμ„ μˆ˜ν–‰ν•˜κ³  λ™μΌν•œ 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚˜λ₯Ό μœ„ν•΄ 그것을 κ³ μ³€μŠ΅λ‹ˆλ‹€.

app.py 슀크립트 상단에 λ‹€μŒ shebang을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

#!/usr/local/bin/python3

그런 λ‹€μŒ κΆŒν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ CMD 전에 Dockerfile 에 λ‹€μŒμ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

RUN chmod 644 app.py

λͺ¨λ“  19 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” 같은 λ¬Έμ œμž…λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ λ‚ μ§œ

  • Python 3.6이 ν¬ν•¨λœ Centos 7.4
  • Python 3.7이 μ„€μΉ˜λœ Mac OSX 10.14.3

이것은 _reloading.pyμ—μ„œ _get_args_for_reloading() 의 λ³€κ²½μœΌλ‘œ 인해 λ°œμƒν•©λ‹ˆλ‹€.

μœ„μ˜ μ½”λ“œκ°€ app.pyλΌλŠ” νŒŒμΌμ— 있고 cwd()κ°€ /home/user/Projects/test/ 인 경우

_get_args_for_reloading() λŠ” λ‹€μŒμ„ μƒμ„±ν•©λ‹ˆλ‹€.

0.14.1 μ‚¬μš©:

['/home/user/.virtualenvs/test-ChRUEUMK/bin/python', 'app.py']

0.15.0 와 ν•¨κ»˜

['/home/user/Projects/test/app.py']

경둜 μ•žμ— /home/user/.virtualenvs/test-ChRUEUMK/bin/python λ₯Ό μΆ”κ°€ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ©λ‹ˆλ‹€.

@shinuza app.pyκ°€ μ‹€ν–‰ κ°€λŠ₯ν•œμ§€ ν™•μΈν•˜κ³  μ‹€ν–‰ κ°€λŠ₯ν•œ 경우 - chmod 644 app.pyλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. λ˜λŠ” 두 번째 λ°©λ²•μœΌλ‘œ #!/usr/bin/env pythonκ³Ό 같이 app.py 상단에 shebang을 μΆ”κ°€ν•©λ‹ˆλ‹€.

@shinuza κ±°κΈ° https://github.com/pallets/werkzeug/blob/0.15.x/src/werkzeug/_reloader.py#L90 라인 90-94 "'/home/user/.virtualenvs/test-ChRUEUMK/bin /python'"은 app.py μ‹€ν–‰ 파일인 경우 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
and OSError: [Errno 8] Exec ν˜•μ‹ 였λ₯˜: '/usr/src/app/app.py app.py에 shebang 쀄이 μ—†κΈ° λ•Œλ¬Έμ— λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€(https://stackoverflow.com/questions/27606653/oserror-errno- 8 μ‹€ν–‰ ν˜•μ‹ 였λ₯˜)

@kamyanskiy 방금 μ½”λ“œλ₯Ό 읽고 이것을 μ•Œμ•„ λƒˆμ§€λ§Œ 였λ₯˜λŠ” μ§€κΈˆκ³Ό 같이 λΉ„λ°€μŠ€λŸ¬μ›Œμ•Όν•©λ‹ˆλ‹€.

λ˜ν•œ λͺ…μ‹œμ μœΌλ‘œ python app.py λ₯Ό μ‹€ν–‰ν•˜λ©΄ ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€κ°€ κ°€μ •ν•˜μ§€ μ•Šκ³  μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 방식을 λ³€κ²½ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. 예: 곡유 폴더가 μžˆλŠ” 가상 λ¨Έμ‹ μœΌλ‘œ μž‘μ—…ν•˜λ©΄ 기본적으둜 λͺ¨λ“  νŒŒμΌμ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@shinuza λ‚˜λŠ” 그것이 치λͺ…적인 버그라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, 이전보닀 μ§€κΈˆμ΄ 쑰금 더 μ—„κ²©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ shebang 없이 μ‹€ν–‰ κ°€λŠ₯ν•œ app.pyκ°€ μžˆμ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. 그리고 두 번째둜 "python app.py"와 같은 shebang으둜 μ‹€ν–‰ νŒŒμΌμ„ μ‹€ν–‰ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” λ™μ˜ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ μ €μ—κ²ŒλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€. :) ν•΄κ²° 방법은 app.py에 shebang을 μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. 이것이 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

슀크립트λ₯Ό μ‹€ν–‰ κ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ ν‘œμ‹œν•˜λŠ” 경우 ν•΄λ‹Ή 인터프리터 주석을 맨 μœ„μ— μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. pre-commit 의 check-executables-have-shebangs 후크와 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

슀크립트λ₯Ό 직접 μ‹€ν–‰ν•˜μ§€ μ•ŠμœΌλ €κ³  λŒ€μ‹  python script.py λ₯Ό μš”κ΅¬ν•˜λ €λ©΄ μ‹€ν–‰ κ°€λŠ₯으둜 ν‘œμ‹œν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

λ‚΄κ°€ λ§ν–ˆλ“―μ΄, λ‚˜λŠ” μ—¬κΈ°μ˜ μ£Όμš” 논리에 λ™μ˜ν•©λ‹ˆλ‹€. λ‚˜λŠ” 였λ₯˜κ°€ μ²˜λ¦¬λ˜λŠ” 방식과 기술적인 μ„ΈλΆ€ 사항을 μ•Œμ§€ λͺ»ν•˜κ±°λ‚˜ μ½”λ“œλ₯Ό 읽지 μ•ŠλŠ” ν•œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 이해할 수 μ—†λ‹€λŠ” 사싀에 λ™μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΅œμ†Œν•œ λ³€κ²½ λ‘œκ·Έμ— λ¬Έμ„œν™”λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μš°λ¦¬λŠ” Linuxμ—μ„œ μ˜€λŠ” 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ œμ–΄ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ‹€ν–‰ 파일이 μ²˜λ¦¬λ˜λŠ” 방식을 λ³€κ²½ν–ˆλ‹€λŠ” 사싀이 λ³€κ²½ λ‘œκ·Έμ— λ‚˜μ—΄λ©λ‹ˆλ‹€.

Python 파일이 μ‹€ν–‰ κ°€λŠ₯으둜 ν‘œμ‹œλœ 경우 λ¦¬λ‘œλ”λŠ” Python μ‹€ν–‰ νŒŒμΌμ„ λͺ…령쀄 μ•žμ— μΆ”κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ λ¦¬λ‘œλ”κ°€ NixOSμ—μ„œ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. #1242

νŒŒμΌμ„ μ‹€ν–‰ λΆˆκ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” 것이 μž‘λ™ν•©λ‹ˆλ‹€. shebang 라인은 λ‚˜λ₯Ό μœ„ν•΄ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  νŒŒμΌμ„ 찾을 수 μ—†μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. 그것이 λ‚΄κ°€ μ‹œλ„ν•œ 첫 번째 μΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

#!/usr/bin/env python3 μ‚¬μš©:

Ξ» docker run flask_test
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
: No such file or directory

λ˜ν•œ ν•˜λ‚˜μ˜ Linux λ°°ν¬νŒμ—μ„œλ§Œ μž‘λ™ν•˜μ§€λ§Œ λ‚˜λ¨Έμ§€λŠ” μ€‘λ‹¨ν•˜λŠ” 변경이 이상적이지 μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. νŒŒμΌμ„ μ‹€ν–‰ κ°€λŠ₯ν•˜μ§€ μ•Šκ²Œ λ§Œλ“œλŠ” 것이 μ μ ˆν•œ 해결책인 것 κ°™μ§€λ§Œ μ—¬μ „νžˆ λ‚˜μ—κ²ŒλŠ” 이것이 κΉ¨μ Έ λ³΄μž…λ‹ˆλ‹€.

@penner42 μ‹œλ„ #!/usr/bin/env 파이썬

root<strong i="7">@4541ebd677e0</strong>:/usr/src/app# ls -la /usr/local/bin/python3
lrwxrwxrwx 1 root staff 9 Mar  4 23:40 /usr/local/bin/python3 -> python3.6
root<strong i="8">@4541ebd677e0</strong>:/usr/src/app# ls -la /usr/local/bin/python 
lrwxrwxrwx 1 root staff 7 Mar  4 23:40 /usr/local/bin/python -> python3

μ•„λ§ˆλ„ python3에 symlinkκ°€ 없을 κ²ƒμž…λ‹ˆλ‹€.

같은 κ²°κ³Όμž…λ‹ˆλ‹€. python3 symlinkκ°€ 있으며 μ…Έμ—μ„œ /usr/bin/env python3 λ˜λŠ” /usr/bin/env python λ₯Ό μ‹€ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

FWIW, DockerλŠ” λΉŒλ“œν•  λ•Œ 이 κ²½κ³ λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

flask run λͺ…령을 μ‚¬μš©ν•©λ‹ˆλ‹€.

FROM python:3.7-alpine
WORKDIR /app
ENV FLASK_ENV development
ENV FLASK_APP example
EXPOSE 5000
RUN ["pip", "install", "flask"]
CMD ["flask", "run", "-h", "0.0.0.0"]
docker run --rm -p 5000:5000 -v $(pwd):/app flask/example:latest

https://docs.docker.com/compose/gettingstarted/ 의 μžμŠ΅μ„œκ°€ Windows 7μ—μ„œ μž‘λ™ν•˜λŠ” 데 μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?
이 졜근 λ³€κ²½ 사항이 예제λ₯Ό μ‹€ν–‰ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” λ™μ•ˆ μœ μ‚¬ν•œ 였λ₯˜κ°€ ν‘œμ‹œλ˜λŠ” μ΄μœ μž…λ‹ˆκΉŒ?

$ docker-compose up
Creating composetest_web_1   ... done
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
redis_1  | 1:C 27 Mar 2019 17:29:12.746 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 27 Mar 2019 17:29:12.746 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 27 Mar 2019 17:29:12.747 # Warning: no config file specified, using the default config. In order to specify a config file use redis-ser
ver /path/to/redis.conf
redis_1  | 1:M 27 Mar 2019 17:29:12.757 * Running mode=standalone, port=6379.
redis_1  | 1:M 27 Mar 2019 17:29:12.757 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to th
e lower value of 128.
redis_1  | 1:M 27 Mar 2019 17:29:12.758 # Server initialized
redis_1  | 1:M 27 Mar 2019 17:29:12.758 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issu
e add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
web_1    |  * Serving Flask app "app" (lazy loading)
web_1    |  * Environment: production
web_1    |    WARNING: Do not use the development server in a production environment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: on
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    | Traceback (most recent call last):
web_1    |   File "app.py", line 32, in <module>
web_1    |     app.run(host="0.0.0.0", debug=True)
web_1    |   File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 943, in run
web_1    |     run_simple(host, port, self, **options)
web_1    |   File "/usr/local/lib/python3.4/site-packages/werkzeug/serving.py", line 988, in run_simple
web_1    |     run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
web_1    |   File "/usr/local/lib/python3.4/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
web_1    |     sys.exit(reloader.restart_with_reloader())
web_1    |   File "/usr/local/lib/python3.4/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
web_1    |     exit_code = subprocess.call(args, env=new_environ, close_fds=False)
web_1    |   File "/usr/local/lib/python3.4/subprocess.py", line 534, in call
web_1    |     with Popen(*popenargs, **kwargs) as p:
web_1    |   File "/usr/local/lib/python3.4/subprocess.py", line 856, in __init__
web_1    |     restore_signals, start_new_session)
web_1    |   File "/usr/local/lib/python3.4/subprocess.py", line 1464, in _execute_child
web_1    |     raise child_exception_type(errno_num, err_msg)
web_1    | OSError: [Errno 8] Exec format error
composetest_web_1 exited with code 1

λ™μΌν•œ νŠœν† λ¦¬μ–Όμ„ μˆ˜ν–‰ν•˜κ³  λ™μΌν•œ 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚˜λ₯Ό μœ„ν•΄ 그것을 κ³ μ³€μŠ΅λ‹ˆλ‹€.

app.py 슀크립트 상단에 λ‹€μŒ shebang을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

#!/usr/local/bin/python3

그런 λ‹€μŒ κΆŒν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ CMD 전에 Dockerfile 에 λ‹€μŒμ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

RUN chmod 644 app.py

λˆ„κ΅¬λ“ μ§€ νŠœν† λ¦¬μ–Όμ„ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€(https://docs.docker.com/compose/gettingstarted/).
μΆ”κ°€ν•˜λ‹€

RUN chmod 644 app.py

도ꡬ 0.15.5μ—μ„œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

lepture picture lepture  Β·  6μ½”λ©˜νŠΈ

ngaya-ll picture ngaya-ll  Β·  8μ½”λ©˜νŠΈ

caiz picture caiz  Β·  3μ½”λ©˜νŠΈ

davidism picture davidism  Β·  9μ½”λ©˜νŠΈ

mrx23dot picture mrx23dot  Β·  6μ½”λ©˜νŠΈ