Flask + Gunicorn 알파인 도커 빌드

1 개요[ | ]

Flask + Gunicorn 알파인 도커 빌드

2 소스코드[ | ]

app.py
from flask import Flask
application = app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

3 Dockerfile[ | ]

3.1 방법 1: apk로 설치[ | ]

FROM alpine:3.14
COPY app.py /app/
WORKDIR /app/
RUN apk add --no-cache py3-gunicorn py3-flask
CMD ["gunicorn","-w","4","--bind","0.0.0.0:5000","app"]
이 글을 보려면 오른쪽 '펼치기' 버튼 클릭
$ docker build -t flask1 .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM alpine:3.14
 ---> d4ff818577bc
Step 2/5 : COPY app.py /app/
 ---> 17dea2106d88
Step 3/5 : WORKDIR /app/
 ---> Running in 77929bffd223
Removing intermediate container 77929bffd223
 ---> 08da4d6645e6
Step 4/5 : RUN apk add --no-cache py3-gunicorn py3-flask
 ---> Running in aedb4b63f6ba
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
(1/26) Installing libbz2 (1.0.8-r1)
(2/26) Installing expat (2.4.1-r0)
(3/26) Installing libffi (3.3-r2)
(4/26) Installing gdbm (1.19-r0)
(5/26) Installing xz-libs (5.2.5-r0)
(6/26) Installing libgcc (10.3.1_git20210424-r2)
(7/26) Installing libstdc++ (10.3.1_git20210424-r2)
(8/26) Installing mpdecimal (2.5.1-r1)
(9/26) Installing ncurses-terminfo-base (6.2_p20210612-r0)
(10/26) Installing ncurses-libs (6.2_p20210612-r0)
(11/26) Installing readline (8.1.0-r0)
(12/26) Installing sqlite-libs (3.35.5-r0)
(13/26) Installing python3 (3.9.5-r1)
(14/26) Installing py3-click (8.0.1-r0)
(15/26) Installing py3-itsdangerous (2.0.1-r0)
(16/26) Installing py3-markupsafe (2.0.1-r0)
(17/26) Installing py3-jinja2 (3.0.1-r0)
(18/26) Installing py3-werkzeug (2.0.1-r0)
(19/26) Installing py3-flask (2.0.1-r0)
(20/26) Installing py3-ordered-set (4.0.2-r1)
(21/26) Installing py3-appdirs (1.4.4-r2)
(22/26) Installing py3-parsing (2.4.7-r2)
(23/26) Installing py3-six (1.15.0-r1)
(24/26) Installing py3-packaging (20.9-r1)
(25/26) Installing py3-setuptools (52.0.0-r3)
(26/26) Installing py3-gunicorn (20.0.4-r1)
Executing busybox-1.33.1-r2.trigger
OK: 65 MiB in 40 packages
Removing intermediate container aedb4b63f6ba
 ---> 679e513e2983
Step 5/5 : CMD ["gunicorn","-w","4","--bind","0.0.0.0:5000","app"]
 ---> Running in d86b930d3f33
Removing intermediate container d86b930d3f33
 ---> e6668ce4aae7
Successfully built e6668ce4aae7
Successfully tagged flask1:latest
$ docker images flask1
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
flask1       latest    e6668ce4aae7   6 minutes ago   59.2MB

3.2 방법 2: pip로 설치 ★[ | ]

FROM python:3.9-alpine
COPY app.py /app/
WORKDIR /app/
RUN pip install gunicorn flask
CMD ["gunicorn","-w","4","--bind","0.0.0.0:5000","app"]
이 글을 보려면 오른쪽 '펼치기' 버튼 클릭
$ docker build -t flask1 .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM python:3.9-alpine
 ---> 56302acacaa7
Step 2/5 : COPY app.py /app/
 ---> 748e0c433bd8
Step 3/5 : WORKDIR /app/
 ---> Running in dc79af823f58
Removing intermediate container dc79af823f58
 ---> 04c15ba23e0e
Step 4/5 : RUN pip install gunicorn flask
 ---> Running in a258b97f736b
Collecting gunicorn
  Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
Collecting flask
  Downloading Flask-2.0.1-py3-none-any.whl (94 kB)
Requirement already satisfied: setuptools>=3.0 in /usr/local/lib/python3.9/site-packages (from gunicorn) (57.0.0)
Collecting click>=7.1.2
  Downloading click-8.0.1-py3-none-any.whl (97 kB)
Collecting Jinja2>=3.0
  Downloading Jinja2-3.0.1-py3-none-any.whl (133 kB)
Collecting itsdangerous>=2.0
  Downloading itsdangerous-2.0.1-py3-none-any.whl (18 kB)
Collecting Werkzeug>=2.0
  Downloading Werkzeug-2.0.1-py3-none-any.whl (288 kB)
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.0.1.tar.gz (18 kB)
Building wheels for collected packages: MarkupSafe
  Building wheel for MarkupSafe (setup.py): started
  Building wheel for MarkupSafe (setup.py): finished with status 'done'
  Created wheel for MarkupSafe: filename=MarkupSafe-2.0.1-py3-none-any.whl size=9761 sha256=1312eb6c31a7c120bc5d2bce7628e778ad5e4ab9ec4a0efdd0005901525539bc
  Stored in directory: /root/.cache/pip/wheels/9f/6d/c8/1f59b07cf85ae842908006ec28f4477f7e4578df72c3eb0e46
Successfully built MarkupSafe
Installing collected packages: MarkupSafe, Werkzeug, Jinja2, itsdangerous, click, gunicorn, flask
Successfully installed Jinja2-3.0.1 MarkupSafe-2.0.1 Werkzeug-2.0.1 click-8.0.1 flask-2.0.1 gunicorn-20.1.0 itsdangerous-2.0.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Removing intermediate container a258b97f736b
 ---> c249f90ac8b7
Step 5/5 : CMD ["gunicorn","-w","4","--bind","0.0.0.0:5000","app"]
 ---> Running in 241317afd496
Removing intermediate container 241317afd496
 ---> 5bffe2100e0e
Successfully built 5bffe2100e0e
Successfully tagged flask1:latest

4 실행[ | ]

$ docker run --name flask1 -d -p 5000:5000 flask1
52d3f56d76053353708adf3f74858fbe7a59d64310ed66b92e9d54822ae7cab9
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                    NAMES
52d3f56d7605   flask1    "gunicorn -w 4 --bin…"   4 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp   flask1
$ curl localhost:5000
<p>Hello, World!</p>
$

5 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}