File size: 5,186 Bytes
36ccd32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
## syntax=docker/dockerfile:1.1.7-experimental

################
# Base builder #
################
FROM python:3.10-bookworm as base_build

ENV \
  # locale environment variables
  LC_ALL=C.UTF-8 \
  # python environemnt variables
  PYTHONFAULTHANDLER=1 \
  PYTHONUNBUFFERED=1 \
  PYTHONHASHSEED=random \
  # pip environmental variables
  PIP_NO_CACHE_DIR=off \
  PIP_DISABLE_PIP_VERSION_CHECK=on \
  PIP_DEFAULT_TIMEOUT=100 \
  # poetry version
  POETRY_VERSION=1.5.0

# Install requirements
RUN apt-get update && apt-get install -y \
        curl \
        git \
        bash \
        build-essential \
        libffi-dev \
        libssl-dev \
        tini \
        openssh-client \
        cargo \
        musl-dev \
        libzbar0 \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/* \
    # github ssh key setting
    && mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com | sort > ~/.ssh/known_hosts \
    # Installing poetry and set the PATH
    && curl -sSL https://install.python-poetry.org | python3 - \
    && echo 'export PATH="/root/.local/bin:$PATH"' >>/root/.profile \
    && export PATH="/root/.local/bin:$PATH" \
    && true
SHELL ["/bin/bash", "-lc"]

# Copy poetry lock and pyproject config files to the container
WORKDIR /pysetup
COPY ./poetry.lock ./pyproject.toml /pysetup/
# Install pip/wheel/virtualenv and build the wheels based on the poetry lock
RUN --mount=type=ssh pip3 install wheel virtualenv poetry-plugin-export \
    && poetry export -f requirements.txt --without-hashes -o /tmp/requirements.txt \
    && pip3 wheel --wheel-dir=/tmp/wheelhouse --trusted-host 172.17.0.1 --find-links=http://172.17.0.1:3141/debian/ -r /tmp/requirements.txt \
    && virtualenv /.venv && source /.venv/bin/activate && echo 'source /.venv/bin/activate' >>/root/.profile \
    && pip3 install --no-deps --trusted-host 172.17.0.1 --find-links=http://172.17.0.1:3141/debian/ --find-links=/tmp/wheelhouse/ /tmp/wheelhouse/*.whl \
    && true


###########################
# Production base builder #
###########################
FROM base_build as production_build
# Copy entrypoint script to the container and src files to the app directory
COPY ./docker/entrypoint.sh /docker-entrypoint.sh
COPY . /app/
WORKDIR /app
# Build the wheel packages with poetry and add them to the wheelhouse
RUN --mount=type=ssh source /.venv/bin/activate \
    && poetry build -f wheel --no-interaction --no-ansi \
    && cp dist/*.whl /tmp/wheelhouse \
    && chmod a+x /docker-entrypoint.sh \
    && true



########################
# Production Container #
########################
FROM python:3.10-bookworm as production
COPY --from=production_build /tmp/wheelhouse /tmp/wheelhouse
COPY --from=production_build /docker-entrypoint.sh /docker-entrypoint.sh
WORKDIR /app
# Install system level deps for running the package and install the wheels we built in the previous step.
RUN --mount=type=ssh apt-get update && apt-get install -y \
        bash \
        libffi8 \
        libgl1 \
        tini \
        libzbar0 \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/* \
    && chmod a+x /docker-entrypoint.sh \
    && WHEELFILE=`echo /tmp/wheelhouse/deep_barcode_reader-*.whl` \
    && pip3 install --trusted-host 172.17.0.1 --find-links=http://172.17.0.1:3141/debian/ --find-links=/tmp/wheelhouse/ "$WHEELFILE"[all] \
    && rm -rf /tmp/wheelhouse/ \
    && true
ENTRYPOINT ["/usr/bin/tini", "--", "/docker-entrypoint.sh"]



############################
# Development base builder #
############################
FROM base_build as development_build
# Copy src to app directory
COPY . /app
WORKDIR /app
# Install dependencies from poetry lock
RUN --mount=type=ssh source /.venv/bin/activate \
    && apt-get update && apt-get install -y libgl1 libzbar0 \
    && export PIP_FIND_LINKS=http://172.17.0.1:3141/debian/ \
    && export PIP_TRUSTED_HOST=172.17.0.1 \
    && pip3 install nvidia-cublas-cu12 nvidia-cusparse-cu12 triton nvidia-nccl-cu12 nvidia-cudnn-cu12 nvidia-cufft-cu12 nvidia-cusolver-cu12 \
    && poetry install --no-interaction --no-ansi \
    && true



###################
# Tests Container #
###################
FROM development_build as test
RUN --mount=type=ssh source /.venv/bin/activate \
    && chmod a+x docker/*.sh \
    && docker/pre_commit_init.sh \
    && true
ENTRYPOINT ["/usr/bin/tini", "--", "docker/entrypoint-test.sh"]


#########################
# Development Container #
#########################
FROM development_build as development
RUN apt-get update && apt-get install -y zsh libzbar0 \
    && sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" \
    && echo "if [ \"\$NO_WHEELHOUSE\" = \"1\" ]" >>/root/.profile \
    && echo "then" >>/root/.profile \
    && echo "  echo \"Wheelhouse disabled\"" >>/root/.profile \
    && echo "else">>/root/.profile \
    && echo "  export PIP_TRUSTED_HOST=172.17.0.1" >>/root/.profile \
    && echo "  export PIP_FIND_LINKS=http://172.17.0.1:3141/debian/" >>/root/.profile \
    && echo "fi" >>/root/.profile \
    && echo "source /root/.profile" >>/root/.zshrc \
    && pip3 install git-up \
    && true
ENTRYPOINT ["/bin/zsh", "-l"]