-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dockerfile
228 lines (152 loc) · 5.3 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
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
###########################################################
# Base
###########################################################
FROM python:3.12-bookworm as base
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1
WORKDIR /app
# copy src files
COPY ./src /app/src
# copy requirements and extension dir
COPY ./requirements.txt ./extension /app/
# install python dependencies
RUN pip install -r requirements.txt
# install non-python dependencies
RUN python setup.py install
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
# Better order
###########################################################
FROM python:3.12-bookworm as opt1
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1
WORKDIR /app
# copy requirements and extension dir
COPY ./requirements.txt ./extension /app/
# install python dependencies
RUN pip install -r requirements.txt
# install non-python dependencies
RUN python setup.py install
# copy src files
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
# 1. Pin Transitive Dependencies
# 2. Disable pip cache
###########################################################
FROM python:3.12-bookworm as opt2
# disable pip cache
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
COPY ./requirements-exported.txt ./extension /app/
# install python dependencies
RUN pip install -r requirements-exported.txt
# install non-python dependencies
RUN python setup.py install
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
# Use slim base image -> throws error
###########################################################
FROM python:3.12-slim-bookworm as opt3_err
# disable pip cache
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
COPY ./requirements-exported.txt ./extension /app/
# install python dependencies
RUN pip install -r requirements-exported.txt
# install non-python dependencies
# this will FAIL!
RUN python setup.py install
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
# 1. Use slim base image
# 2. Install C++ compiler
# 3. Remove compiler after build
###########################################################
FROM python:3.12-slim-bookworm as opt3
# disable pip cache
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1
RUN apt-get update \
&& apt-get install -y g++
WORKDIR /app
# copy requirements and extension dir
COPY ./requirements-exported.txt ./extension /app/
RUN pip install -r requirements-exported.txt
RUN python setup.py install
RUN apt-get purge -y --auto-remove g++
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
# Combine layers
###########################################################
FROM python:3.12-slim-bookworm as opt4
# disable pip cache
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
# copy requirements and extension dir
COPY ./requirements-exported.txt ./extension /app/
# build dependencies
RUN apt-get update \
&& apt-get install -y g++ \
&& pip install -r requirements-exported.txt \
&& python setup.py install \
&& apt-get purge -y --auto-remove g++
# copy src files
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
FROM python:3.12-bookworm as opt5_builder
###########################################################
ENV VIRTUAL_ENV=/opt/venv \
PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
COPY requirements-exported.txt extension ./
RUN pip install setuptools \
&& pip install -r requirements-exported.txt \
&& python setup.py install
FROM python:3.12-slim-bookworm AS opt5
ENV VIRTUAL_ENV=/opt/venv
COPY --from=opt5_builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
WORKDIR /app
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]
###########################################################
FROM python:3.12-bookworm as opt6_builder
###########################################################
ENV VIRTUAL_ENV=/opt/venv \
PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
COPY requirements-exported.txt extension ./
RUN --mount=type=cache,target=/root/.cache/pip pip install setuptools \
&& pip install -r requirements-exported.txt \
&& python setup.py install
FROM python:3.12-slim-bookworm AS opt6
ENV VIRTUAL_ENV=/opt/venv
COPY --from=opt6_builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
WORKDIR /app
COPY ./src /app/src
EXPOSE 80
CMD ["uvicorn", "src.server:app", "--host", "0.0.0.0", "--port", "80"]