缩放时,只运行一次 docker 容器启动命令

时间:2021-05-24 16:06:37

标签: docker docker-compose

我有以下docker-compose.yml

version: "3.1"

services:
  db:
    container_name: ${MYSQL_CONTAINER}
    image: mysql:5.7.30
    volumes:
      - ${VOLUMES_DIR}/mysql_data:/var/lib/mysql
      - ./slow_log.cnf:/etc/mysql/my.cnf
      - ${VOLUMES_DIR}/mysql_logs:/var/log/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
    ports:
        - ${MYSQL_PORT}:3306
    entrypoint: ""
    command: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password"
    restart: on-failure

  backend:
    container_name: ${BACKEND_CONTAINER}
    image: ${BACKEND_IMAGE}
    depends_on:
      - db
    ports:
      - ${BACKEND_PORT}
    command: >
      bash -c "command A
      && command B
      && ... "
    restart: unless-stopped

我正在扩展后端服务,所以我的启动命令是 sudo docker-compose -p ${COMPOSE_PROJECT_NAME} up -d --scale backend=10

我面临的问题是命令 A,服务 backend 中的命令 B 正在运行所有 10 个容器启动(意味着它们运行了 10 次)。 但我希望 command A 只为所有 backend 服务相关容器运行一次,但 Command B 应该为所有容器运行。

有什么建议可以实现这一点吗?

2 个答案:

答案 0 :(得分:0)

我不完全确定是否有满足您要求的现成解决方案。

不过,我可以建议您采用这样的解决方法。您可以在 docker-compose 中复制您的后端服务,并使用 Command ACommand B 运行一个后端服务,而另一个后端只有 Command B

然后,当您想要扩展时,您可以扩展只有 Command B 的后端。

version: "3.1"

services:
  db:
    container_name: ${MYSQL_CONTAINER}
    image: mysql:5.7.30
    volumes:
      - ${VOLUMES_DIR}/mysql_data:/var/lib/mysql
      - ./slow_log.cnf:/etc/mysql/my.cnf
      - ${VOLUMES_DIR}/mysql_logs:/var/log/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
    ports:
        - ${MYSQL_PORT}:3306
    entrypoint: ""
    command: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password"
    restart: on-failure

  backend_default:
    container_name: ${BACKEND_CONTAINER}
    image: ${BACKEND_IMAGE}
    depends_on:
      - db
    ports:
      - ${BACKEND_PORT}
    command: >
      bash -c "command A
      && command B
      && ... "
    restart: unless-stopped

  backend:
    container_name: ${BACKEND_CONTAINER}
    image: ${BACKEND_IMAGE}
    depends_on:
      - db
    ports:
      - ${BACKEND_PORT}
    command: >
      bash -c "command B
      && ... "
    restart: unless-stopped

现在您可以使用 scale 选项,如下所示:

sudo docker-compose -p ${COMPOSE_PROJECT_NAME} up -d --scale backend=9

现在,如果碰巧有一个场景,您只需要运行 1 个后端,您可以使用 https://docs.mongodb.com/manual/reference/operator/query/nin/ 仅在使用 docker-compose 提供特定配置文件时运行 backend命令。这意味着如果没有给出该配置文件,则只有 default_backend 将运行,因此比例为 1。

希望对你有帮助。干杯? !!!

答案 1 :(得分:0)

如果 BACKEND_IMAGE 是由您构建的,您应该在 Dockerfile 中执行 RUN command ARUN 行在构建期间只会执行一次 - 因此您还需要确保这符合您的需求 - 而 ENTRYPOINTCMD 行只会运行容器的执行。 docker-compose 文件中的 command 覆盖了 CMD 行。