我有以下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
应该为所有容器运行。
有什么建议可以实现这一点吗?
答案 0 :(得分:0)
我不完全确定是否有满足您要求的现成解决方案。
不过,我可以建议您采用这样的解决方法。您可以在 docker-compose 中复制您的后端服务,并使用 Command A
和 Command 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 A
。 RUN
行在构建期间只会执行一次 - 因此您还需要确保这符合您的需求 - 而 ENTRYPOINT
和 CMD
行只会运行容器的执行。 docker-compose 文件中的 command
覆盖了 CMD
行。