Last active
March 29, 2025 06:05
-
-
Save soof-golan/6ebb97a792ccd87816c0bda1e6e8b8c2 to your computer and use it in GitHub Desktop.
Python + Poetry + Docker Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask | |
app = Flask(__name__) | |
@app.route('/') | |
def hello_world(): | |
return 'Hello, Docker!' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" ] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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!')" ] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[[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"}, | |
] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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