近期项目中,期望通过同一docker-compose.yml脚本,在同一个服务器上创建出多套运行环境(基础测试环境,压测测试环境,基础部署环境)。但在运行 `docker-compose -f $app_path up -d` 时,发现新环境的创建首先会关闭旧的环境,导致一次只能运行一套环境。
通过查阅文章,和--help指令发现是因为docker-compose默认会以文件夹名作为docker-compose项目名,因此同一套docker-compose工程多次运行会生成相同的project,新的project会顶掉老的project。
示例docker-compose.yml如下,通过配置.env文件设置环境变量,配置不同环境下的容器端口及容器命名。
version: "3"
services:
mysql:
container_name: "mysql$ENV_NAME_SUFFIX"
restart: always
image: mysql:5.7
privileged: true
env_file:
- ../../.env
ports:
- ${DB_PORT}:3306
volumes:
- ./mysql/log:/var/log/mysql
- ./mysql/mysql-files:/var/lib/mysql-files
- ./mysql/data:/var/lib/mysql
- ./mysql/config:/etc/mysql/conf.d
- ../server/sql:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
TZ: Asia/Shanghai
# user: 1001:1001
command: --lower_case_table_names=1
networks:
- default
redis:
container_name: "redis$ENV_NAME_SUFFIX"
image: redis:4.0.9
restart: always
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD}
TZ: Asia/Shanghai
ports:
- ${REDIS_PORT}:6379
volumes:
- ./redis/redis.conf:/etc/redis/redis.conf
- ./redis/data:/data
command: redis-server /etc/redis/redis.conf --requirepass $REDIS_PASSWORD --appendonly yes
networks:
- default
networks:
default:
external:
name: ${ENV_NETWORK}
最终通过docker-compose -p 解决生成新的独立环境的问题。
docker-compose -f $app_path -p $(basename $app)$ENV_NAME_SUFFIX up -d
参考文章