Dockerize 페트병 어플리케이션

13395 단어 flaskdockerpython

지난주에 간단한 "Hello World"Flask 프로그램을 시작하라는 요청을 받았지만, Docker 용기에 실행해야 합니다.본고에서, 나는 당신에게 내가 어떻게 이 도전을 해결했는지 보여줄 것입니다!

플라스크 구조와 의존 관계


간단한'안녕한 세상'이라도 나는 건축의 최선의 실천으로 그것을 실현한다.다음과 같은 디렉토리 구조가 있습니다.
.
├── backend
│   ├── app.py
│   ├── blueprints
│   │   ├── core
│   │   │   ├── bp.py
│   │   │   ├── __init__.py
│   │   │   ├── routes.py
│   │   │   └── tests
│   │   │       └── test_bp_core.py
│   │   └── __init__.py
│   └── __init__.py
├── conftest.py
├── Dockerfile
├── .dockerignore
├── .gitignore
├── Pipfile
├── Pipfile.lock
├── pytest.ini
└── README.md
.(dot)은 프로젝트의 뿌리입니다.backend에서 나는 소병을 정확하게 사용했다.나는 구조에서 공장 모델을 사용했다.그래서 app.py에서 저는 하나 있습니다.
from flask import Flask


def create_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'My_Top_Secert_Key'

    # Blueprint

    from backend.blueprints.core import bp as bp_core
    bp_core.config(app)

    return app
이 코드는 내 Flask 응용 프로그램을 만드는 것을 책임집니다.본고의 중점은 플라스크 등을 해석하는 것이 아니다.그러나 응용 프로그램을 구성하여 Docker 컨테이너에 실행하는 방법은 다음과 같습니다.backend/bluprints/core에서 저는 제 청사진이 있습니다(dedocumentation to know more about blueprints 참조). 코드는 bp에 있습니다.py와route.py, 모두 나의 핵심 청사진을 배치했다.첫 번째 코드는 다음과 같습니다.
from flask import Blueprint


bp = Blueprint('core', __name__)


def config(app):
    from backend.blueprints.core import routes # noqa
    app.register_blueprint(bp)
두 번째 코드는 다음과 같습니다.
from backend.blueprints.core.bp import bp


@bp.route('/')
def home():
    return "Hello World"
backend/blueprint/core/tests에서 나는 이 청사진에 대해 테스트를 진행했다.이것은 간단한 테스트입니다. 코드는 다음과 같습니다.
import pytest

from flask import url_for


@pytest.fixture
def resp(client):
    return client.get(url_for('core.home'))


def test_bp_home_status_code_ok(resp):
    assert resp.status_code == 200

Again, the focus of this article isn't to explain detailed of the Flask application, so if you have questions about how to test Flask apps please see the documentation.

Back to the root of the application, I have some files that are interesting to see!

One is the conftest.py. This file is responsible for set up pytest to run all tests in the application. Its code is:

import pytest

from backend.app import create_app


@pytest.fixture
def app():
    app = create_app()
    return app


@pytest.fixture
def client(app):
    with app.test_client() as c:
        yield c
또 하나는 pytest.ini, 간단한 파일로 pytest 파일 테스트 이름을 알리는 모델입니다. 우리의 예시에서 pytest.ini 코드는 다음과 같습니다.
[pytest]
python_files=test*.py *tests.py
나머지 두 파일은 PipfilePipfile.lock입니다.이 파일들은 명령 pipenv install [package]에 의해 생성되거나 업데이트됩니다.우리가 잠시 후에 볼 수 있는 바와 같이, 우리의 예시에서 가장 중요한 것은 Pipfile.lock이다. 왜냐하면 모든 의존항의 버전을 잠그고 우리의 환경에서 이러한 의존항을 확실하게 설치할 수 있기 때문이다.
우리는 아직 Dockerfile개가 있다.이 파일은 Docker 이미지 생성을 담당합니다.이 그림은 플라스크 프로그램을 사용하여 용기를 끌어올리는 데 사용됩니다.코드는 다음과 같습니다.
FROM python:3.7.1

LABEL Author="Vicente Marçal"
LABEL E-mail="[email protected]"
LABEL version="0.0.1b"

ENV PYTHONDONTWRITEBYTECODE 1
ENV FLASK_APP "backend/app.py"
ENV FLASK_ENV "development"
ENV FLASK_DEBUG True

RUN mkdir /app
WORKDIR /app

COPY Pip* /app/

RUN pip install --upgrade pip && \
    pip install pipenv && \
    pipenv install --dev --system --deploy --ignore-pipfile

ADD . /app

EXPOSE 5000

CMD flask run --host=0.0.0.0
간략한 설명:
FROM python:3.7.1
FROM은 내 이미지를 만드는 데 사용할 기본 이미지를 정의합니다.이 예에서 나는 pyton:3.7.1의 기초 이미지를 사용한다.
LABEL Author="Vicente Marçal"
LABEL은 작성자 이름, 이메일 및 Dockerfile 버전 등의 정보를 저장하는 방법입니다.
RUN mkdir /app
RUN은 명령을 실행하는 것을 맡고 이 예에서 mkdir /app은 루트 디렉터리에 앱이라는 디렉터리를 만듭니다.
WORKDIR /app
WORKDIR은 작업 디렉터리를 정의했습니다. 이 예에서 저의 /appRUN 자구에서 이전에 만든 것입니다.
COPY Pip* /app/
COPY은 호스트에서 컨테이너로 파일을 복사하는 것을 책임집니다. 이 경우 *은 Docker에게 모든 파일을 Pip에서 /app/으로 복사하라고 통지합니다.주의: /으로 감독의 경로를 정하는 것이 매우 중요하다
RUN pip install --upgrade pip && \
    pip install pipenv && \
    pipenv install --dev --system --deploy --ignore-pipfile
RUN 자구는 pip 업그레이드, pipenv 설치 및 Flask 응용 프로그램 의존 항목을 설치하는 데 사용됩니다.플라스크 관련성을 설치하기 위해 pipenv install과 일부 표지를 사용했습니다.--dev이것 또한 개발 의존항을 설치해야 한다는 것을 나타낸다.--system이 점은 매우 중요하다. 왜냐하면 Docker 용기에서 우리는 여전히 고립된 환경을 가지고 있기 때문에virtualenv를 만들 필요가 없다. 이 표지판은 pipenv에게 이 점을 알릴 수 있다.--deploy--ignore-pipfilepipenvPipfile.lock을 사용하여 모든 의존 항목을 설치하라고 알립니다.Pipfile.lock에서 우리는 당신의 버전과 모든 의존 관계를 잠갔습니다
ADD . /app
모든 의존 항목을 설치한 후 ADD조는 호스트의 Dockerfile이 있는 디렉터리의 모든 파일을 용기의 /app에 추가합니다.
Obs:
같은 디렉터리에 .dockerignore이라는 파일이 있습니다. .gitignore과 유사합니다. 이 파일은 Docker에게 내용 중의 파일과 디렉터리를 무시하라고 알립니다.
EXPOSE 5000
본 조항은 컨테이너의 5000호 항구를 대외적으로 개방한다.
CMD flask run --host=0.0.0.0
마지막으로 자구 CMD은 용기를 구축하고 구축한 후 명령을 실행합니다.이 예에서 이 명령은 호스트 0.0.0.0.0에서 Flask 서버를 실행하고 Flask 응용 프로그램에 서비스하는 flask run --host=0.0.0.0입니다.
Obs:
분명히 이것은 작은 테스트이다.생산에서 사용할 필요가 있다면, 개발 환경에서만 사용하는 Flask 서버가 아니라 uWSGI나 gunicorn 같은 WSGI 서버를 실행하는 것을 권장합니다.COPYADD의 사용 정보:
Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features (like local-only tar extraction and remote URL support) that are not immediately obvious. Consequently, the best use for ADD is local tar file auto-extraction into the image, as in ADD rootfs.tar.xz /.

참고 번호: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
이것이 바로 Flask 응용 프로그램에 대한 Dockerize가 필요한 모든 내용입니다.이제 Docker 이미지를 만들고 실행해야 합니다.
구축을 위해 다음 Docker CLI 명령을 사용합니다.
docker build -t vm_docker_flask .
명령 docker build은 이미지를 구축합니다. -t 로고를 사용하여 vm\udocker\uflask를 이미지에 표시합니다. 마지막으로 CLI의 마지막 부분은 .(점)입니다. docker Dockerfile이 현재 디렉터리에 있음을 알립니다.
이 명령은 터미널에 이 결과를 표시합니다.
Sending build context to Docker daemon  29.18kB
Step 1/15 : FROM python:3.7.1
 ---> 1e80caffd59e
Step 2/15 : LABEL Author="Vicente Marçal"
 ---> Running in a7975e93672a
Removing intermediate container a7975e93672a
 ---> 448662ef63d8
Step 3/15 : LABEL E-mail="[email protected]"
 ---> Running in 75f6319066de
Removing intermediate container 75f6319066de
 ---> 0898192a03f7
Step 4/15 : LABEL version="0.0.1b"
 ---> Running in defb5aee2083
Removing intermediate container defb5aee2083
 ---> 02042247ded0
Step 5/15 : ENV PYTHONDONTWRITEBYTECODE 1
 ---> Running in 5e9124dfa05c
Removing intermediate container 5e9124dfa05c
 ---> c35cd3ecc42f
Step 6/15 : ENV FLASK_APP "backend/app.py"
 ---> Running in ea58e08644ad
Removing intermediate container ea58e08644ad
 ---> f2fb780d29fc
Step 7/15 : ENV FLASK_ENV "development"
 ---> Running in f72976410ba2
Removing intermediate container f72976410ba2
 ---> bb444664e3b0
Step 8/15 : ENV FLASK_DEBUG True
 ---> Running in e18257443538
Removing intermediate container e18257443538
 ---> a2bbca32f540
Step 9/15 : RUN mkdir /app
 ---> Running in ebbcc284fe40
Removing intermediate container ebbcc284fe40
 ---> 7fb8c7fac9f8
Step 10/15 : WORKDIR /app
 ---> Running in c76604d10578
Removing intermediate container c76604d10578
 ---> 074aa15fee4c
Step 11/15 : COPY Pip* /app/
 ---> 554f403d7b11
Step 12/15 : RUN pip install --upgrade pip && pip install pipenv && pipenv install --dev --system --deploy --ignore-pipfile
 ---> Running in 08faec42b7d5
Collecting pip
  Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB)
Installing collected packages: pip
  Found existing installation: pip 18.1
    Uninstalling pip-18.1:
      Successfully uninstalled pip-18.1
Successfully installed pip-19.0.3
Collecting pipenv
  Downloading https://files.pythonhosted.org/packages/13/b4/3ffa55f77161cff9a5220f162670f7c5eb00df52e00939e203f601b0f579/pipenv-2018.11.26-py3-none-any.whl (5.2MB)
Requirement already satisfied: pip>=9.0.1 in /usr/local/lib/python3.7/site-packages (from pipenv) (19.0.3)
Collecting virtualenv-clone>=0.2.5 (from pipenv)
  Downloading https://files.pythonhosted.org/packages/e3/d9/d9c56deb483c4d3289a00b12046e41428be64e8236fa210111a1f57cc42d/virtualenv_clone-0.5.1-py2.py3-none-any.whl
Collecting virtualenv (from pipenv)
  Downloading https://files.pythonhosted.org/packages/33/5d/314c760d4204f64e4a968275182b7751bd5c3249094757b39ba987dcfb5a/virtualenv-16.4.3-py2.py3-none-any.whl (2.0MB)
Collecting certifi (from pipenv)
  Downloading https://files.pythonhosted.org/packages/9f/e0/accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/certifi-2018.11.29-py2.py3-none-any.whl (154kB)
Requirement already satisfied: setuptools>=36.2.1 in /usr/local/lib/python3.7/site-packages (from pipenv) (40.6.2)
Installing collected packages: virtualenv-clone, virtualenv, certifi, pipenv
Successfully installed certifi-2018.11.29 pipenv-2018.11.26 virtualenv-16.4.3 virtualenv-clone-0.5.1
Installing dependencies from Pipfile.lock (9a5a3a)…
Removing intermediate container 08faec42b7d5
 ---> 740ed1329305
Step 13/15 : ADD . /app
 ---> 3551608282e2
Step 14/15 : EXPOSE 5000
 ---> Running in 07b57fe6a5e7
Removing intermediate container 07b57fe6a5e7
 ---> 2e07658bbae8
Step 15/15 : CMD flask run --host=0.0.0.0
 ---> Running in bdf7404770f6
Removing intermediate container bdf7404770f6
 ---> cf7d3ee68072
Successfully built cf7d3ee68072
Successfully tagged vm_docker_flask:latest
이후에 우리는 우리의 용기를 운행해야 한다.follow Docker CLI 명령은
 docker run -d --name my_container_flask -p 5000:5000 vm_docker_flask
명령 docker run은 우리의 용기를 실행합니다. 로고 -d은 백그라운드에서 실행 중인 Docker에게 알립니다. 로고 --name은 my\u container\u 플라스크를 우리의 용기에 넣고, 로고 -p은 용기의 포트 5000을 호스트의 포트 5000에 연결합니다. 마지막으로 docker build 명령에서 구축된 이미지의 이름입니다.
이 명령은 컨테이너 id로 돌아가기 때문에 터미널에 이 결과를 표시합니다.
33169f573b7bdf078ef8d55741ec037f2914aa78343ad96c8277854c3bcdf6b2
이제 컨테이너가 실행 중인지 확인하는 첫 번째 테스트를 수행할 수 있습니다. 이를 위해 다음과 같이 Docker CLI 명령을 실행합니다.
pythonprojects/docker_flask_app [ docker container ps        ] 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
880a5b59f2aa        vm_docker_flask     "/bin/sh -c 'flask r…"   15 minutes ago      Up 15 minutes       0.0.0.0:5000->5000/tcp   my_container_flask
이 Docker CLI 명령은 컨테이너 ID, 이미지, 명령 등 실행 중인 컨테이너와 그 정보를 표시합니다.우리의 경우, 단지 나의 용기만 있을 뿐, 너는 위를 볼 수 있다.
우리가 할 수 있는 또 다른 테스트는 간단한 HTTP 요청이다.나는 이 테스트에서 httpie application을 사용했다.최종 결과를 보려면 다음과 같이 하십시오.
pythonprojects/docker_flask_app [ http 0.0.0.0:5000         ]
HTTP/1.0 200 OK
Content-Length: 11
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Mar 2019 18:17:24 GMT
Server: Werkzeug/0.14.1 Python/3.7.1

Hello World
지금이 가장 중요한 테스트야.Flask 응용 프로그램에 대한 테스트를 실행하기 위해 컨테이너에서 pytest를 실행합니다.Flask 응용 프로그램이 상태 코드가 200Ok로 되돌아올 때만 테스트는 간단한 단언입니다!
이를 위해 다음 Docker CLI 명령을 실행합니다.
 docker exec my_container_flask pytest 
이 docker CLI 명령은 my\u container\u flask에서 pytest를 실행합니다. 모든 것이 정상적이면 다음 최종 결과를 얻을 수 있습니다.
=========================== test session starts ============================
platform linux -- Python 3.7.1, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /app, inifile: pytest.ini
plugins: sugar-0.9.2, flask-0.14.0
collected 1 item

backend/blueprints/core/tests/test_bp_core.py .                      [100%]

========================= 1 passed in 0.06 seconds =========================

이게 다야!!

좋은 웹페이지 즐겨찾기