如何使用docker-machine部署docker组合的应用程序?

时间:2017-09-23 01:21:30

标签: docker docker-compose docker-machine

如何使用docker-machine使用简单的Rails应用程序部署docker-compose app?它有意义吗?

我已阅读过有关该主题的多篇文章,包括official Docker docs on using Compose in productionRemote 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"

看起来我错过了一些关于机器的重要概念。我应该如何编写生产撰写文件以使它们在远程容器主机上工作?

1 个答案:

答案 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

中执行该路径