我不确定我的问题是否相关,因为我可能会尝试混合不应该混合的工具(Capistrano和Docker)。
我最近对一个使用Capistrano部署的应用程序进行了容器化。 Docker Compose在开发和演示环境中都被使用。
这就是我的项目看起来像什么(没有显示应用程序文件):
Capfile
docker-compose.yml
docker-compose.staging.yml
config/
deploy.rb
deploy
staging.rb
Docker Compose文件创建所有必要的容器(包括Nginx、PHP、MongoDB、Elasticsearch等),以便在开发或分段环境中运行应用程序(因此定义了一些特定参数在docker-compose.staging.yml中)。使用此命令将应用部署到分段环境:
cap staging deploy
服务器上的文件夹结构与Capistrano的文件夹结构相同:
current
releases
20160912150720
20160912151003
20160912153905
shared
已在暂存服务器的current
目录中运行以下命令,以实例化所有必要的容器来运行应用程序:
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
目前为止都很好。在下一次部署中,情况变得更加复杂:current
符号链接将指向releases
目录中的一个新目录:
- 如果
deploy.rb
定义了需要在容器内执行的命令(比如PHP的docker-compose exec php composer install
),Docker会告诉你这些容器不存在(因为现有的容器是在前一个发布文件夹中创建的)。 - 如果在Capistrano部署过程中执行
docker-compose up -d
命令,则会出现一些错误,因为端口冲突(以前的容器仍然存在)。
你有解决这个问题的想法吗?我应该远离Capistrano并做一些不同的事情吗?
这个想法是保持Capistrano所提供的(几乎)零停机部署,并具有Docker容器的灵活性(为同一台服务器上的各种应用程序提供多个PHP版本,例如)。