如何使用docker-machine使用简单的Rails应用程序部署docker-compose app?它有意义吗?
我已阅读过有关该主题的多篇文章,包括official Docker docs on using Compose in production和Remote Deployment Guide by Rackspace,但这些文章都不适用于我。
我有一个非常简单的Rails应用程序,由以下docker-compose
文件描述:
version: '3'
services:
app:
build:
context: .
dockerfile: containers/production/Dockerfile
image: projectname:app
command: containers/production/bootstrap.sh
ports:
- 3000:3000
volumes:
- .:/app
- gems:/gems
depends_on:
- db
environment:
- DOCKERIZED=1
db:
image: postgres:9.6
ports:
- '5432:5432'
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
gems:
接下来我尝试使用docker-machine
将其部署到远程主机:
eval "$(docker-machine env production)"
docker-compose build
docker-compose up -d
前两个步骤非常有效。 Docker主机附加到本地Compose,app
图像构建,db
容器开始生产。但是启动app
失败了:
Creating projectname_app_1 ...
Creating projectname_app_1 ... error
ERROR: for projectname_app_1 Cannot start service app: oci runtime error: container_linux.go:262: starting container process caused "exec: \"containers/production/bootstrap.sh\": stat containers/production/bootstrap.sh: no such file or directory"
看起来我错过了一些关于机器的重要概念。我应该如何编写生产撰写文件以使它们在远程容器主机上工作?
答案 0 :(得分:1)
从我在错误消息中看到的内容看起来您的问题是containers/production/bootstrap.sh
在docker实例中不存在。 command
执行docker容器内的脚本,而不是主机中的脚本。
将脚本复制到容器的workdir
中,并使用类似./bootstrap.sh
的内容执行它,或者这样的内容也可能有所帮助:
app:
build:
context: .
dockerfile: containers/production/Dockerfile
image: projectname:app
command: /bootstrap.sh
ports:
- 3000:3000
volumes:
- .:/app
- gems:/gems
- ./containers/production/bootstrap.sh:/bootstrap.sh
depends_on:
- db
environment:
- DOCKERIZED=1
检查我是否将主机上的文件与容器内的相应路径(/bootstrap.sh
)进行匹配,并在command