From 9fb77a1aa2e044dda3ccb3ae9b166cf3990ee913 Mon Sep 17 00:00:00 2001 From: lingniu Date: Wed, 1 Jul 2026 12:40:25 +0800 Subject: [PATCH] deploy: parameterize portainer image prefix --- deploy/portainer/docker-compose.yml | 11 ++++--- .../PortainerComposeResourceLimitsTest.java | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/deploy/portainer/docker-compose.yml b/deploy/portainer/docker-compose.yml index bb5d2575..be6c3f75 100644 --- a/deploy/portainer/docker-compose.yml +++ b/deploy/portainer/docker-compose.yml @@ -4,6 +4,7 @@ version: "3.8" # Legacy and optional services stay outside this compose file. # Set LINGNIU_IMAGE_VERSION in Portainer Stack env, for example: # main-0.1.0-SNAPSHOT-22468e7 +# Override LINGNIU_IMAGE_REGISTRY / LINGNIU_IMAGE_NAMESPACE only when publishing to another registry. x-common-env: &common-env TZ: Asia/Shanghai JAVA_OPTS: ${JAVA_OPTS:---sun-misc-unsafe-memory-access=allow -XX:+UseZGC -XX:MaxRAMPercentage=75} @@ -53,7 +54,7 @@ x-readiness-healthcheck: &readiness-healthcheck services: gb32960-ingest-app: - image: crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/gb32960-ingest-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} + image: ${LINGNIU_IMAGE_REGISTRY:-crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com}/${LINGNIU_IMAGE_NAMESPACE:-oneos}/gb32960-ingest-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} container_name: gb32960-ingest-app restart: unless-stopped mem_limit: ${GB32960_MEM_LIMIT:-768m} @@ -87,7 +88,7 @@ services: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:20100/actuator/health/readiness >/dev/null"] jt808-ingest-app: - image: crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/jt808-ingest-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} + image: ${LINGNIU_IMAGE_REGISTRY:-crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com}/${LINGNIU_IMAGE_NAMESPACE:-oneos}/jt808-ingest-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} container_name: jt808-ingest-app restart: unless-stopped mem_limit: ${JT808_MEM_LIMIT:-768m} @@ -113,7 +114,7 @@ services: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:20400/actuator/health/readiness >/dev/null"] yutong-mqtt-app: - image: crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/yutong-mqtt-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} + image: ${LINGNIU_IMAGE_REGISTRY:-crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com}/${LINGNIU_IMAGE_NAMESPACE:-oneos}/yutong-mqtt-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} container_name: yutong-mqtt-app restart: unless-stopped mem_limit: ${YUTONG_MQTT_MEM_LIMIT:-512m} @@ -146,7 +147,7 @@ services: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:20500/actuator/health/readiness >/dev/null"] vehicle-history-app: - image: crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/vehicle-history-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} + image: ${LINGNIU_IMAGE_REGISTRY:-crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com}/${LINGNIU_IMAGE_NAMESPACE:-oneos}/vehicle-history-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} container_name: vehicle-history-app restart: unless-stopped mem_limit: ${VEHICLE_HISTORY_MEM_LIMIT:-1536m} @@ -184,7 +185,7 @@ services: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:20200/actuator/health/readiness >/dev/null"] vehicle-analytics-app: - image: crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com/oneos/vehicle-analytics-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} + image: ${LINGNIU_IMAGE_REGISTRY:-crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com}/${LINGNIU_IMAGE_NAMESPACE:-oneos}/vehicle-analytics-app:${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION} container_name: vehicle-analytics-app restart: unless-stopped mem_limit: ${VEHICLE_ANALYTICS_MEM_LIMIT:-1024m} diff --git a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/PortainerComposeResourceLimitsTest.java b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/PortainerComposeResourceLimitsTest.java index a2078dbf..0f87dff7 100644 --- a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/PortainerComposeResourceLimitsTest.java +++ b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/PortainerComposeResourceLimitsTest.java @@ -39,6 +39,27 @@ class PortainerComposeResourceLimitsTest { assertServiceMemoryLimit(compose, "vehicle-analytics-app", "VEHICLE_ANALYTICS_MEM_LIMIT", "1024m"); } + @Test + void productionImagesShareOverridableRegistryAndNamespace() throws IOException { + String compose = Files.readString(repositoryRoot().resolve("deploy/portainer/docker-compose.yml")); + String registry = "${LINGNIU_IMAGE_REGISTRY:-crpi-85r4m0ackrm3qpje.cn-shanghai.personal.cr.aliyuncs.com}"; + String namespace = "${LINGNIU_IMAGE_NAMESPACE:-oneos}"; + + for (String serviceName : List.of( + "gb32960-ingest-app", + "jt808-ingest-app", + "yutong-mqtt-app", + "vehicle-history-app", + "vehicle-analytics-app")) { + assertThat(serviceBlock(compose, serviceName)) + .contains("image: " + registry + "/" + namespace + "/" + serviceName + + ":${LINGNIU_IMAGE_VERSION:?set LINGNIU_IMAGE_VERSION}"); + } + assertThat(countOccurrences(compose, "image: crpi-85r4m0ackrm3qpje")) + .isZero(); + assertThat(countOccurrences(compose, "/oneos/")).isZero(); + } + @Test void portainerServicesUseContainerReadinessHealthchecks() throws IOException { String compose = Files.readString(repositoryRoot().resolve("deploy/portainer/docker-compose.yml")); @@ -490,6 +511,16 @@ class PortainerComposeResourceLimitsTest { return compose.substring(start, end); } + private static int countOccurrences(String text, String needle) { + int count = 0; + int index = 0; + while ((index = text.indexOf(needle, index)) >= 0) { + count++; + index += needle.length(); + } + return count; + } + private static Properties yamlProperties(Path path) { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(new FileSystemResource(path));