运行 docker-在docker-机器上撰写

running docker-compose on a docker-machine

我正在尝试使用 docker-machine 和 docker-compose 在单个 ec2 实例上部署两个服务。

这是我正在做的事情:

docker-machine create --driver amazonec2 --engine-install-url=https://web.archive.org/web/20170623081500/https://get.docker.com mymachine

docker-machine ssh mymachine -- mkdir -p /home/ubuntu/myapp

git clone https://github.com/myapp/service1.git
docker-machine scp -r ./service1 mymachine:/home/ubuntu/myapp/
rm -rf ./service1

git clone https://github.com/myapp/service2.git
docker-machine scp -r ./service2 mymachine:/home/ubuntu/myapp/
rm -rf ./service2

docker-machine env mymachine
//export DOCKER_TLS_VERIFY="1"
//export DOCKER_HOST="something"
//export DOCKER_CERT_PATH="something"
//export DOCKER_MACHINE_NAME="mymachine"

eval $(docker-machine env mymachine)

docker-machine active
//mymachine

docker-compose -f ./docker-compose-prod.yml up -d

我收到此错误:build path /home/ubuntu/myapp/service1 either does not exist, is not accessible, or is not a valid URL.

docker-compose-prod.yml的相关部分:

version: '3'

services:
  service1:
    build:  /home/ubuntu/myapp/service1

  service2:
    build:  /home/ubuntu/myapp/service2

通过 ssh 检查时路径很好,似乎 docker-compose 仍在尝试在我的本地机器上工作,当我为它提供本地存在的构建路径时它很高兴。 Docker 自己在远程机器上执行命令。

如何让 docker-compose 到远程 docker-机器上的 运行?

我是新手,所以希望我遗漏了一些微不足道的东西。 感谢您的帮助!

一个docker build(包括docker-compose build)涉及一个"build context"。此上下文是您 select 从客户端发送到 docker 引擎的所有文件,包括 Dockerfile,以执行构建。您可以使用 .dockerignore 文件从此上下文中删除文件。

当您 运行 一个 docker build /home/ubuntu/myapp/service1 或在您的情况下,将该目录包含在 compose.yml 文件中时,您将 /home/ubuntu/myapp/service1 定义为您发送的构建上下文docker 引擎的客户端。该引擎可能是本地节点或远程节点,在您的情况下是 ec2 实例。从那里开始,所有 运行 都是远程的,包括 Dockerfile 中引用此上下文的任何 COPYADD 命令。

为了 运行 您的远程构建,您可以将上下文留在本地机器上,而不是 运行 连接您的 rm,或者您可以通过 ssh 进入 ec2 实例并运行 该机器上的 docker-compose 命令(您可能需要在那里安装 docker-compose,我不确定它是否包含在默认机器映像中)。我的偏好通常是前者,因为它允许更容易地开发用于构建图像的文件,并且它允许远程 docker 机器是短暂的。