From a294e8a6a5d97a4d846772691c22476fa97d79c9 Mon Sep 17 00:00:00 2001 From: Holger Frey Date: Wed, 11 Aug 2021 20:29:27 +0200 Subject: [PATCH] trying new Dockerfile --- Dockerfile | 12 ++++++++++++ flit_freeze.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 flit_freeze.py diff --git a/Dockerfile b/Dockerfile index c47eda9..e9c0d5c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ FROM python:3.8-alpine +# install required packages RUN apk add --no-cache gcc RUN apk add --no-cache python3-dev RUN apk add --no-cache libc-dev @@ -7,7 +8,10 @@ RUN apk add --no-cache libffi-dev RUN apk add --no-cache openssl RUN apk add --no-cache openssl-dev +# add user that will be used to install and run the application RUN adduser -D deploy + +# switch to the created user and install the application USER deploy ENV PATH "$PATH:/home/deploy/.local/bin" @@ -21,4 +25,12 @@ RUN pip install wheel RUN pip install -r requirements.txt RUN flit install --pth-file +# switch back to root to remove header files +USER root +RUN apk delete python3-dev +RUN apk delete libffi-dev +RUN apk delete openssl-dev + +# switch to the created user to run the application +USER deploy CMD ["gunicorn", "--paster", "/app/production.ini", "-b", "0.0.0.0:8000"] diff --git a/flit_freeze.py b/flit_freeze.py new file mode 100644 index 0000000..15712e7 --- /dev/null +++ b/flit_freeze.py @@ -0,0 +1,51 @@ +import re +import subprocess +import sys +import toml + + +REGEX_PKG = re.compile("^([\w\.\[\],_-]+)") +REGEX_SINGLE = re.compile("([\w\._-]+)") + + +def get_pip_freeze_list(): + freeze_text = subprocess.check_output( + [sys.executable, '-m', 'pip', 'list', '-l', '--format=freeze'] + ) + freeze_text = freeze_text.decode("utf-8") + return freeze_text.strip().splitlines() + +def get_raw_packages_from_pyproject_file(filename="pyproject.toml"): + pyproject = toml.load(filename) + _flit = pyproject["tool"]["flit"]["metadata"] + pyproject_pkgs = _flit["requires"] + pyproject_pkgs += _flit["requires-extra"]["test"] + pyproject_pkgs += _flit["requires-extra"]["dev"] + return pyproject_pkgs + + +def _parse_package_names(toml_pkgs): + for pkg in toml_pkgs: + group = REGEX_PKG.match(pkg)[0] + yield from REGEX_SINGLE.finditer(group) + +def get_package_names(filename="pyproject.toml"): + toml_pkgs = get_raw_packages_from_pyproject_file(filename) + as_string = (m.group() for m in _parse_package_names(toml_pkgs)) + lowercased = (item.lower() for item in as_string) + return {item.replace("_", "-") for item in lowercased} + +def filter_toml_pkgs_from_freeze_list(freeze_list, toml_pkgs): + for line in freeze_list: + freeze_pkg, _ = line.split("=", 1) + if freeze_pkg.lower() in toml_pkgs: + yield line + +def main(toml_file="pyproject.toml"): + freeze_list = get_pip_freeze_list() + toml_pkgs = get_package_names(toml_file) + return filter_toml_pkgs_from_freeze_list(freeze_list, toml_pkgs) + + +if __name__ == "__main__": + print("\n".join(sorted(main(), key=lambda x: x.lower())))