我想动态创建一个网络并将同一网络附加到 docker-compose 服务

问题描述 投票:0回答:1

这是我的 docker-compose.yml 文件:

version: "3.7"

networks:
  default:
    external:
      name: ${NETWORK_NAME}
      
services:
  runner:
    container_name: runner-${PROJECT_NAME}
    build:
      context: .
      target: production
    volumes:
      - ./:/app
      - /app/node_modules
      - /host/path/to/files:/app/files
    tty: true
    stdin_open: true
    depends_on:
      - cache
    ports:
      - "${DYNAMIC_PORT}:8000"
    networks:
      - "${NETWORK_NAME}"
    environment:
      - FILE_BASE_PATH=/app/files
      - TERM=xterm
    command: node dist/index.js

  queue_worker:
    container_name: queue_worker-${PROJECT_NAME}
    build:
      context: .
      target: production
    volumes:
      - ./:/app
      - /app/node_modules
      - /host/path/to/files:/app/files
    depends_on:
      - cache
    networks:
      - "${NETWORK_NAME}"
    command: node dist/Service.QueueWorker/index.js

  cache:
    image: redis:6.2-alpine
    restart: always
    ports:
      - "${REDIS_PORT}:6379"
    networks:
      - "${NETWORK_NAME}"
    command: redis-server --save 20 1 --loglevel warning
    volumes:
      - "${CACHE_VOLUME_NAME}:/data"

这是我的 bash 脚本:

#!/bin/bash

find_free_port() {
  local port
  while true; do
    port=$(shuf -i 2000-65000 -n 1)
    if ! nc -z localhost $port; then
      echo $port
      return 0
    fi
  done
}

APP_PORT=$(find_free_port)
REDIS_PORT=$(find_free_port)

# timestamp-based unique project names
PROJECT_NAME="project_$(date +%s)"
NETWORK_NAME="${PROJECT_NAME}_network"
CACHE_VOLUME_NAME="cache_${PROJECT_NAME}"

# Create a custom network
docker network create -d bridge "$NETWORK_NAME"

echo "Application is running on port: $APP_PORT under project: $PROJECT_NAME"

REDIS_PORT=$REDIS_PORT \
DYNAMIC_PORT=$APP_PORT \
PROJECT_NAME=$PROJECT_NAME \
NETWORK_NAME=$NETWORK_NAME \
CACHE_VOLUME_NAME=$CACHE_VOLUME_NAME \
docker-compose -p "$PROJECT_NAME" -f docker-compose.instance.yml up

# docker network rm "$NETWORK_NAME"

当我运行 docker-compose up 时,出现此错误:

服务“cache”引用未定义的网络project_1728932200_network:无效的撰写项目

我正在尝试动态创建 docker-compose 容器,并为每个容器集合添加自定义网络。我希望网络名称是动态的,并且服务能够附加到各自的网络。

docker docker-compose docker-network
1个回答
0
投票

Compose 实际上本身就具有这种功能,但是您需要让它选择事物的名称。 Compose 有“项目名称”的概念;每个不同的项目名称都有自己的一组容器、卷和网络,并且项目名称嵌入在 Compose 生成的事物的名称中。 您的脚本已经有一个 docker-compose -p 选项,因此您正在使用此功能;你需要停止覆盖各种名称。

在 Compose 文件中,删除 

networks:

块中的 all; Compose 将生成一个名为

default
的网络 Compose(以及类似
default_projectname
的 Docker 命名),并自动将所有容器附加到该网络。 删除
container_name:
行中的 all。 您没有包含顶级
volumes:
块,但也删除了那里的
name:
行。
另一部分是端口分配。  同样,Docker 能够在发布端口时自动选择主机端口。  在 

ports:

 块中,列出仅指示容器端端口的单个端口。
经过一些额外的清理,Compose 文件应该如下所示

version: "3.7" volumes: cache: services: runner: build: . volumes: - /host/path/to/files:/app/files depends_on: - cache ports: - "8000" environment: - FILE_BASE_PATH=/app/files - TERM=xterm queue_worker: build: . volumes: - /host/path/to/files:/app/files depends_on: - cache command: node dist/Service.QueueWorker/index.js cache: image: redis:6.2-alpine restart: always ports: - "6379" command: redis-server --save 20 1 --loglevel warning volumes: - "cache:/data"

要重新获取 Docker 选择的端口号,您需要运行 
docker-compose port

这也显着简化了您的包装器脚本。  您只需选择项目名称,启动 Compose,然后打印出端口号。  你可以减少到

#!/bin/sh export COMPOSE_PROJECT_NAME="project_$(date +%s)" export COMPOSE_FILE=docker-compose.instance.yml docker-compose up -d echo "app port:" docker-compose port app echo "cache port:" docker-compose port cache docker-compose wait app docker-compose down -v

	
© www.soinside.com 2019 - 2024. All rights reserved.