Обновить
3
Алексей Маркевич@amarkevich

DevOps

1
Подписчики
Отправить сообщение

.dockerignore влияет на контекст, передаваемый во время билда. а вот команды вида COPY ./ ./ уже тянут в контейнер всё подряд.

Multi-stage build нужно применять с умом: некоторые CI/CD поддерживают кэширование зависимостей (Bitbucket), подтягивают результаты билдов, например результаты юнит тестов. да и в целом внутри докера работает медленнее.

Что касается сборки Python приложений, то на примере с Poetry компактный образ можно получить так:

Poetry билдер
ARG PYTHON_VERSION=3.13

FROM python:${PYTHON_VERSION}-alpine

ENV PIP_DEFAULT_TIMEOUT=100 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    PIP_NO_CACHE_DIR=1 \
    POETRY_VERSION=2.1.1 \
    PYTHONUNBUFFERED=1

ENV PATH="/root/.local/bin:${PATH}"

RUN apk add --no-cache gcc alpine-sdk linux-headers && \
    wget https://install.python-poetry.org -O - | python3 - && \
    poetry self add poetry-plugin-bundle
приложение
ARG PYTHON_VERSION=3.13

FROM company.com/python-poetry-base-builder:python${PYTHON_VERSION} AS builder

COPY pyproject.toml ./
COPY ./src/. ./src

RUN poetry lock && \
    poetry bundle venv --only=main /venv -vvv

FROM python:${PYTHON_VERSION}-alpine
COPY --from=builder /venv /venv

ENTRYPOINT ["/venv/bin/app-name"]

У HikariCP по дефолту в пуле двадцать соединений

10

насколько данные рекомендации подойдут для случая cloud sql proxy, когда соединение происходит по сути локалько к sidecar контейнеру?

не Spring’ом единым жив мир Java разработки. но если есть опыт использования, то нескоторые шаги могут упростить разработку и улучшить показатели:

упрощение управления версиями зависимостей
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webmvc</artifactId>
        </dependency>
    </dependencies>
подготовка thin jar без spring-boot-maven-plugin
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>dependency/</classpathPrefix>
                            <mainClass>com.company.Application</mainClass> <!-- replace with actual value -->
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

запуск через java -jar app.jar

исключение неиспользуемых зависимостей

если REST сервис отдаёт MediaType.TEXT_PLAIN_VALUE, то Jackson можно исключить

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-webmvc</artifactId>
                <version>${spring-boot.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-jackson</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

Ещё один небольшой плюс для производительности связан с размером uber-jar, который вы собираете.

скорость запуска увеличится, если перейти к thin jar без оспользования spring-boot-maven-plugin

VolumeSource: OCI Artifact and/or Image: в статусе беты был включён по умолчанию в 1.35. было бы удобно видеть статус по умолчанию для новых фич

стоит упомянуть ограничения AoT :

  • The classpath is fixed and fully defined at build time

  • The beans defined in your application cannot change at runtime, meaning:

deprecation notice на докер хабе висит очень давно. странно, что кто-то ещё ими пользуется

для безопасности применяется кодировка Base64

для экранирования

для локальной разработки достаточно и кэширования слоёв; да и путь выглядит так, что под виндой ожидаем проблемы. в случае клауд билда - кэш всё равно пустой.

предпочёл использовать библиотеку

wget https://repo1.maven.org/maven2/[...].jar && [...]

если уже используется PostgreSQL - логично использовать расширение pg_partman

на Python можно написать простой таймер

программисту только дай повод написать очередной велосипед. используйте cron - и руки не будут уставаить писать

развитие собственного велосипеда конечно хорошо, но удивляет игнорирование сущемтвующей спеки Jakarta JAX-RS

разрешение "terraform apply" только из мейна (ну и в дев окружении)

пару лет назад столкнулся с периодическими ошибками сборки проектов в Google Cloud Build. В основе лежит вызов контейнеров, поэтому вместо ванильного maven:3-eclipse-temurin-17-alpine стал использовать образ с закешированными зависимостями (требует пересборки при значительных изменениях зависимостей):
RUN mvn dependency:go-offline

в контейнерах часто отсутствует bash, поэтому лучше по возможности делать скрипты на sh

С помощью maven-jar-plugin зависимости добавляются в манифест, отлично сочетается с maven-dependency-plugin:copy-dependencies

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>dependency/</classpathPrefix>
                <mainClass>com.company.Application</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

связка maven-dependency-plugin + maven-jar-plugin с соответствующей конфигурацией подготавливает приложения для запуски и не зависит от версий/фич/багов spring-boot-maven-plugin

так и было задумано. при конфигурации версия зависимостей фиксируется на мажорной-минорной версии. простая пересборка контейнера подтянет новую патч версию при наличии

1
23 ...

Информация

В рейтинге
6 378-й
Откуда
Минск, Минская обл., Беларусь
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик, DevOps-инженер