Portainer中Docker Stack是否支持Docker Compose Profiles?
问题描述
使用的工具版本
- Ubuntu版本:22.04.1
- Docker版本:23.0.0,构建号e92dd87
- Docker Compose版本:v2.16.0
- Portainer版本:2.17.0
场景与配置
按照Portainer官方文档「从Git仓库添加Stack」的指引部署Stack,配置了dev和prod两个Docker Compose Profiles,docker-compose.yml内容如下:
version: '3.4' services: backend: image: ${DOCKER_REGISTRY-}myproject profiles: ["dev", "prod"] db: image: postgres:15.2-alpine3.17 profiles: ["dev", "prod"] frontend: image: ${DOCKER_REGISTRY-}myproject_frontend profiles: ["dev", "prod"] volumes: db_data: frontend_data: logs:
遇到的问题
- 尝试通过
COMPOSE_PROFILES=prod docker compose up命令行方式指定Profile部署,但无论是否使用该变量,均报错:
Deployment error failed to deploy a stack: no service selected
- 在Portainer的「附加路径」中指定
docker-compose.prod.yml路径,仍出现相同错误;若将该路径设为「Compose路径」,则每个命名卷都会报错:
service "frontend" refers to undefined volume "frontend_data"
- 但将
docker-compose.prod.yml内容复制到docker-compose.yml并删除COMPOSE_PROFILES变量后,Stack部署成功。
用户疑问
Portainer的Stack是否支持Docker Compose Profiles?是该功能不可用还是操作有误?
解答
Portainer 2.17.0支持Docker Compose Profiles,你的问题出在操作方式上,以下是正确处理步骤:
正确传递COMPOSE_PROFILES环境变量
不要在本地命令行中使用COMPOSE_PROFILES=prod,而是在Portainer添加Stack的页面中,找到「环境变量」配置区域,手动添加COMPOSE_PROFILES=prod。Portainer的Stack部署流程独立解析Compose文件,本地命令行的环境变量不会传递到其部署上下文,这才导致“no service selected”错误——Portainer未收到指定Profile的指令,而所有服务都标记为仅属于特定Profile,没有服务会被选中部署。正确处理多Compose文件
若存在docker-compose.prod.yml附加配置文件,正确做法是:- 将主文件
docker-compose.yml设置为Portainer的「Compose路径」 - 将
docker-compose.prod.yml添加到「附加路径」列表中
Portainer会自动合并两个文件的配置,既保留主文件的volumes定义,又能应用prod文件的额外配置。之前把prod文件设为「Compose路径」会丢失主文件的volumes定义,因此出现卷未定义的错误。
- 将主文件
验证Profile配置
你的docker-compose.yml中所有服务都包含prodProfile,只要正确传递COMPOSE_PROFILES=prod,Portainer就能识别并部署所有服务,不会再出现“no service selected”的问题。
内容的提问来源于stack exchange,提问作者user2771704

