-
-
Save soof-golan/6ebb97a792ccd87816c0bda1e6e8b8c2 to your computer and use it in GitHub Desktop.
from flask import Flask | |
app = Flask(__name__) | |
@app.route('/') | |
def hello_world(): | |
return 'Hello, Docker!' |
FROM python:3.10 as python-base | |
# https://python-poetry.org/docs#ci-recommendations | |
ENV POETRY_VERSION=1.2.0 | |
ENV POETRY_HOME=/opt/poetry | |
ENV POETRY_VENV=/opt/poetry-venv | |
# Tell Poetry where to place its cache and virtual environment | |
ENV POETRY_CACHE_DIR=/opt/.cache | |
# Create stage for Poetry installation | |
FROM python-base as poetry-base | |
# Creating a virtual environment just for poetry and install it with pip | |
RUN python3 -m venv $POETRY_VENV \ | |
&& $POETRY_VENV/bin/pip install -U pip setuptools \ | |
&& $POETRY_VENV/bin/pip install poetry==${POETRY_VERSION} | |
# Create a new stage from the base python image | |
FROM python-base as example-app | |
# Copy Poetry to app image | |
COPY --from=poetry-base ${POETRY_VENV} ${POETRY_VENV} | |
# Add Poetry to PATH | |
ENV PATH="${PATH}:${POETRY_VENV}/bin" | |
WORKDIR /app | |
# Copy Dependencies | |
COPY poetry.lock pyproject.toml ./ | |
# [OPTIONAL] Validate the project is properly configured | |
RUN poetry check | |
# Install Dependencies | |
RUN poetry install --no-interaction --no-cache --without dev | |
# Copy Application | |
COPY . /app | |
# Run Application | |
EXPOSE 5000 | |
CMD [ "poetry", "run", "python", "-m", "flask", "run", "--host=0.0.0.0" ] |
FROM python:3.10 | |
# Configure Poetry | |
ENV POETRY_VERSION=1.2.0 | |
ENV POETRY_HOME=/opt/poetry | |
ENV POETRY_VENV=/opt/poetry-venv | |
ENV POETRY_CACHE_DIR=/opt/.cache | |
# Install poetry separated from system interpreter | |
RUN python3 -m venv $POETRY_VENV \ | |
&& $POETRY_VENV/bin/pip install -U pip setuptools \ | |
&& $POETRY_VENV/bin/pip install poetry==${POETRY_VERSION} | |
# Add `poetry` to PATH | |
ENV PATH="${PATH}:${POETRY_VENV}/bin" | |
WORKDIR /app | |
# Install dependencies | |
COPY poetry.lock pyproject.toml ./ | |
RUN poetry install | |
# Run your app | |
COPY . /app | |
CMD [ "poetry", "run", "python", "-c", "print('Hello, World!')" ] |
[[package]] | |
name = "click" | |
version = "8.1.3" | |
description = "Composable command line interface toolkit" | |
category = "main" | |
optional = false | |
python-versions = ">=3.7" | |
[package.dependencies] | |
colorama = {version = "*", markers = "platform_system == \"Windows\""} | |
[[package]] | |
name = "colorama" | |
version = "0.4.5" | |
description = "Cross-platform colored terminal text." | |
category = "main" | |
optional = false | |
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" | |
[[package]] | |
name = "flask" | |
version = "2.2.2" | |
description = "A simple framework for building complex web applications." | |
category = "main" | |
optional = false | |
python-versions = ">=3.7" | |
[package.dependencies] | |
click = ">=8.0" | |
itsdangerous = ">=2.0" | |
Jinja2 = ">=3.0" | |
Werkzeug = ">=2.2.2" | |
[package.extras] | |
async = ["asgiref (>=3.2)"] | |
dotenv = ["python-dotenv"] | |
[[package]] | |
name = "itsdangerous" | |
version = "2.1.2" | |
description = "Safely pass data to untrusted environments and back." | |
category = "main" | |
optional = false | |
python-versions = ">=3.7" | |
[[package]] | |
name = "jinja2" | |
version = "3.1.2" | |
description = "A very fast and expressive template engine." | |
category = "main" | |
optional = false | |
python-versions = ">=3.7" | |
[package.dependencies] | |
MarkupSafe = ">=2.0" | |
[package.extras] | |
i18n = ["Babel (>=2.7)"] | |
[[package]] | |
name = "markupsafe" | |
version = "2.1.1" | |
description = "Safely add untrusted strings to HTML/XML markup." | |
category = "main" | |
optional = false | |
python-versions = ">=3.7" | |
[[package]] | |
name = "werkzeug" | |
version = "2.2.2" | |
description = "The comprehensive WSGI web application library." | |
category = "main" | |
optional = false | |
python-versions = ">=3.7" | |
[package.dependencies] | |
MarkupSafe = ">=2.1.1" | |
[package.extras] | |
watchdog = ["watchdog"] | |
[metadata] | |
lock-version = "1.1" | |
python-versions = "^3.10" | |
content-hash = "181ecf21593eeadd78073fcdba99b6207d2101817871cd0a31056b4301628404" | |
[metadata.files] | |
click = [ | |
{file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, | |
{file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, | |
] | |
colorama = [ | |
{file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, | |
{file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, | |
] | |
flask = [ | |
{file = "Flask-2.2.2-py3-none-any.whl", hash = "sha256:b9c46cc36662a7949f34b52d8ec7bb59c0d74ba08ba6cb9ce9adc1d8676d9526"}, | |
{file = "Flask-2.2.2.tar.gz", hash = "sha256:642c450d19c4ad482f96729bd2a8f6d32554aa1e231f4f6b4e7e5264b16cca2b"}, | |
] | |
itsdangerous = [ | |
{file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, | |
{file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, | |
] | |
jinja2 = [ | |
{file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, | |
{file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, | |
] | |
markupsafe = [ | |
{file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, | |
{file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, | |
{file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, | |
{file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, | |
{file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, | |
{file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, | |
] | |
werkzeug = [ | |
{file = "Werkzeug-2.2.2-py3-none-any.whl", hash = "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5"}, | |
{file = "Werkzeug-2.2.2.tar.gz", hash = "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f"}, | |
] |
[tool.poetry] | |
name = "python-poetry-docker-example" | |
version = "0.1.0" | |
description = "" | |
authors = ["Someone <[email protected]>"] | |
[tool.poetry.dependencies] | |
python = "^3.10" | |
Flask = "^2.1.2" | |
[tool.poetry.dev-dependencies] | |
[build-system] | |
requires = ["poetry-core>=1.0.0"] | |
build-backend = "poetry.core.masonry.api" |
Wouldn't it be better to export requirements.txt at the time when we install poetry, copy requirements.txt to the next stage and install dependencies using pip? I think it will help to reduce image size
Please. Can you explain how to use this Dockerfile when working with django.
I get:
Traceback (most recent call last):
web_1 | File "/app/manage.py", line 11, in main
web_1 | from django.core.management import execute_from_command_line
web_1 | ModuleNotFoundError: No module named 'django'
web_1 |
web_1 | The above exception was the direct cause of the following exception:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/app/manage.py", line 22, in
web_1 | main()
web_1 | File "/app/manage.py", line 13, in main
web_1 | raise ImportError(
web_1 | ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
my toml
[tool.poetry.dependencies]
python = "^3.10"
Django = "^5.1.7"
dotenv = "^0.9.9"
googletrans = "4.0.0rc1"
gTTS = "2.5.2"
flake8 = "^7.1.2"
python-docx = "^1.1.2"
pytest = "^8.3.5"
pytest-django = "^4.10.0"
mixer = "^7.2.2"
ruff = "^0.11.2"
psycopg2-binary = "^2.9.10"
Thanks
poetry install
does not generate the lock file, it uses it to "know" which packages to install.Using the
poetry.lock
file ensures that every time you runpoetry install
you will get the same set of packages* into your {,virtual} Python environment.@Simon-The-Human, you can read all about it in the poetry docs.
Self Nit
The lockfile contains multiple soltions to your dependency tree, each solution targeting a different os, cpu arch, python version that you are using.