我正在尝试部署一个使用docker-compose构建的应用程序,但感觉我的方向完全错误。
docker-compose up
使用适当的网络和主机启动我的应用程序。.env
文件。我目前的工作流程如下所示:
docker save [web image] [db image] > containers.tar
zip deploy.zip containers.tar docker-compose.yml
rsync deploy.zip user@server
ssh user@server
unzip deploy.zip ./
docker load -i containers.tar
docker-compose up
此时,我希望能够再次运行docker-compose up
,但是会尝试按照docker-compose.yml
文件重建容器。
我有一种明显的感觉,我错过了一些东西。我应该通过我的完整应用程序发货,然后在服务器上构建图像吗?如果从注册表中存储/加载图像,您将如何启动合成容器?
答案 0 :(得分:4)
问题是我在开发和生产中使用了相同的docker-compose.yml文件。
app服务没有指定存储库名称或标记,所以当我在服务器上运行docker-compose up
时,它只是尝试在我的应用程序的源代码目录中构建Dockerfile(它不存在于服务器)。
我最后通过向本地docker-compose.yml添加显式图像字段来解决问题。
version: '2'
services:
web:
image: 'my-private-docker-registry:latest'
build: ./app
然后为生产创建了另一个撰写文件:
version: '2'
services:
web:
image: 'my-private-docker-registry:latest'
# no build field!
在本地运行docker-compose build
后,将使用存储库名称my-private-docker-registry
和标记latest
构建Web服务映像。
然后,这只是将图像推送到存储库的情况。
docker push 'my-private-docker-registry:latest'
运行docker pull
,使用新图像停止并重新创建正在运行的容器是安全的。