...
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
... ...
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
... Вспомните про кеширование слоёв
RUN pip install --no-cache-dir -r requirements.txt RUN apt-get update \
&& apt-get install -y --no-install-recommends \
<smth_libs> \
&& rm -rf /var/lib/apt/lists/* Не появится ли в образе чего-то лишнего?
...
RUN pip install -r requirements.txt
...
docker run trainer-image:latest docker run trainer-image:latest ...
RUN apt-get update && \
apt-get install python3 python3-pip && \
rm -rf /var/lib/apt/lists/*
... ...
RUN apt-get update && \
apt-get install python3 python3-pip && \
rm -rf /var/lib/apt/lists/*
...
...
COPY model.format /models/model.format
...
# первый образ скачивает модель
FROM python:3.12 as model-downloader
ARG FILE_SERVER_URL
ENV FILE_SERVER_URL=${FILE_SERVER_URL}
WORKDIR /app
RUN pip install requests --no-cache-dir
COPY build/download_model.py model.json /app/
RUN python download_model.py
# второй образ не занимается скачиванием и ожидает, что
# готовая модель уже на месте
FROM python:3.12 as prod
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py /app/
CMD python main.py version: "3.8"
services:
model-inference:
build:
context: .
dockerfile: Dockerfile
target: prod
depends_on:
# в основном образе ждём,
# пока отработает скачивание модели
download-model:
condition: service_completed_successfully
ports:
- 8000:8000
volumes:
# подключились к volume с моделью на чтение
- model:/app/ro
download-model:
build:
context: .
dockerfile: Dockerfile
target: model-downloader
args:
- FILE_SERVER_URL=<model_url>
volumes:
# подключились к тому же volume, что и основной контейнер,
# но с правом записывать туда
- model:/app/rw
volumes:
model: version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "80:3000"
depends_on:
- backend
backend:
build: ./backend
depends_on:
- db
db:
image: postgres:15
volumes:
- db_/var/lib/postgresql/data
volumes:
db_ version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "80:3000"
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- frontend
db:
image: postgres:15
ports:
- "5432:5432"
depends_on:
- frontend Правильно ли построено дерево зависимостей? И что будет при перезапуске docker-compose?
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/* RUN apt-get update
RUN apt-get install -y curl Будет ли индекс вечно свеж?
Sending build context to Docker daemon 25GB Вспомните про контекст сборки
build-api:
rules:
- changes:
- services/api/**/*
- shared/**/*
script:
- docker build ...
build-worker:
rules:
- changes:
- services/worker/**/*
- shared/**/*
script:
- docker build ...
# ...
# ... # tree .
repo/
├── services/
│ ├── api/
│ ├── worker/
│ └── dl/
└── shared/ *Подсказка – Что можно сказать про масштабирование?
docker run --restart=no ...
docker run --restart=always ...
docker run --restart=unless-stopped ...
docker run --restart=on-failure:5 ... # сборка
FROM golang:1.24 AS build
WORKDIR /src
COPY <<EOF /src/main.go
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.go
# в финальный образ кладём только нужный бинарник. В нём не будет компиляторов
# и т.п. и он будет весить меньше
FROM scratch
COPY --from=build /bin/hello /bin/hello
CMD ["/bin/hello"] FROM python:3.12 as prod
WORKDIR /app
RUN apt update \
&& apt install -y curl \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py .
CMD python main.py
FROM prod as dev
COPY requirements.dev.txt .
# дополнительно ставим зависимости, которые нужны только для разработки
RUN pip install --no-cache-dir -r requirements.dev.txt *Подсказка – Что можно сказать про масштабирование?
...
COPY heavy-requirements.txt .
RUN pip install --no-cache-dir -r heavy-requirements.txt
COPY light-requirements.txt .
RUN pip install --no-cache-dir -r light-requirements.txt
... ...
COPY light-requirements.txt heavy-requirements.txt ./
RUN pip install --no-cache-dir -r light-requirements.txt -r heavy-requirements.txt
... Хотим ли мы переустанавливать «тяжёлые» зависимости, если изменились «лёгкие»?