-
Notifications
You must be signed in to change notification settings - Fork 2
/
Dockerfile
95 lines (76 loc) · 4.89 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
########################################################################################################################
# #
# pyTMBot - Dockerfile #
# -------------------------------------------------------------------------------------------------------------------- #
# A lightweight Telegram bot for managing Docker containers and images, monitoring server statuses, #
# and extending its functionality with plugins. #
# #
# Project: pyTMBot #
# Author: Denis Rozhnovskiy <pytelemonbot@mail.ru> #
# Repository: https://github.com/orenlab/pytmbot #
# License: MIT #
# Description: This Dockerfile builds a secure, minimal image based on Alpine Linux with Python 3.12. #
# It includes a Docker socket for managing containers without requiring root access for other tasks. #
# #
########################################################################################################################
# Set base images tag
ARG PYTHON_IMAGE=3.13-alpine3.20
ARG ALPINE_IMAGE=3.21
########################################################################################################################
######################### BUILD ALPINE BASED IMAGE #####################################################################
########################################################################################################################
# First Alpine stage - build Python deps
FROM python:${PYTHON_IMAGE} AS builder
# Python version (minimal - 3.12)
ARG PYTHON_VERSION=3.13
# Copy and install dependencies
COPY requirements.txt .
RUN apk --no-cache add --virtual .build-deps \
gcc python3-dev musl-dev linux-headers binutils && \
python${PYTHON_VERSION} -m venv /venv && \
/venv/bin/python -m ensurepip --upgrade && \
/venv/bin/pip install --no-cache-dir -r requirements.txt && \
find /venv/lib/python${PYTHON_VERSION}/site-packages/ -name '*.so' -exec strip --strip-unneeded {} + || true && \
find /venv/lib/python${PYTHON_VERSION}/site-packages/ -type d -name 'tests' -exec rm -rf {} + || true && \
find /venv/lib/python${PYTHON_VERSION}/site-packages/ -type d -name '__pycache__' -exec rm -rf {} + || true && \
apk del .build-deps && \
rm -rf /root/.cache
########################################################################################################################
######################### SETUP FINAL IMAGE ###########################################################################
########################################################################################################################
# Second Alpine stage - setup bot environment
FROM alpine:${ALPINE_IMAGE} AS release_base
# Python version (minimal - 3.12)
ARG PYTHON_VERSION=3.13
# Update and install essential packages in a single step
RUN apk --no-cache upgrade && \
apk --no-cache add tzdata
# Set workdir and environment variables
WORKDIR /opt/app/
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PYTHONPATH=/opt/app \
PATH=/venv/bin:$PATH
# Copy necessary Python files and directories from first stage
COPY --from=builder /usr/local/bin/ /usr/local/bin/
COPY --from=builder /usr/local/lib/ /usr/local/lib/
COPY --from=builder /venv /venv
# Copy app files in one step to reduce layers
COPY ./pytmbot ./pytmbot
COPY ./main.py ./main.py
COPY ./entrypoint.sh ./entrypoint.sh
# Set permissions for entrypoint script
RUN chmod 700 ./entrypoint.sh && \
rm -rf /root/.cache/* && \
rm -rf /tmp/*
########################################################################################################################
######################### TARGETS SETUP ###############################################################################
########################################################################################################################
# Target for CI/CD image
FROM release_base AS production
ENTRYPOINT ["./entrypoint.sh"]
# Target for self build image, --mode = prod
FROM release_base AS self_build
# Copy config file with token (prod, dev)
COPY pytmbot.yaml ./
ENTRYPOINT ["./entrypoint.sh"]