docker-组成不向远程容器添加代码

docker-compose up not adding code to remote container

我已经 运行 完成了最初的 Overview of Docker Compose 完全按照写的那样,它在本地与 boot2docker 一起工作得很好。但是,如果我尝试在远程主机上执行 docker-compose up,它不会将代码添加到远程容器。

重现:

  1. 运行 到开头的 Overview of Docker Compose 与写的完全一样。
  2. 安装 Docker Machine 并在任何云提供商上启动 Dockerized VM。
    1. docker-machine create --driver my-favourite-cloud composetest
    2. eval "$(docker-machine env composetest)"
  3. 现在您正在使用远程主机,运行 docker-compose up 原始代码。
    1. composetest $ docker-compose up

Redis 运行可以,但 Flask 应用程序不行。

composetest $ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
794c90928b97        composetest_web     "/bin/sh -c 'python    About a minute ago   Exited (2) About a minute ago                       composetest_web_1
2c70bd687dfc        redis               "/entrypoint.sh redi   About a minute ago   Up About a minute               6379/tcp            composetest_redis_1

出了什么问题?

composetest $ docker logs 794c90928b97
python: can't open file 'app.py': [Errno 2] No such file or directory

我们可以确认一下吗?

composetest $ docker-compose run -d  web sleep 60
Starting composetest_redis_1...
composetest_web_run_3

composetest $ docker exec -it a4 /bin/bash
root@a4a73c6dd159:/code# ls -a
.  ..

那里什么都没有。我们可以修复它吗?

注释掉 docker-compose.yml

中的卷
web:
  build: .
  ports:
   - "5000:5000"
  # volumes:
  #  - .:/code
  links:
   - redis
redis:
  image: redis

然后 docker-compose up 就可以了!

让我们在 boot2 上再试一次docker。

composetest $ eval "$(boot2docker shellinit)"
composetest $ docker-compose up
Recreating composetest_redis_1...
Recreating composetest_web_1...
Attaching to composetest_redis_1, composetest_web_1
...

Flask 应用程序可以正常工作,但存在严重问题。如果您更改 app.py,Flask 开发服务器不会重新加载,并且不会自动看到这些更改。即使您停止容器并再次 docker-compose up ,仍然看不到更改。我意识到我们失去了这个 essential 功能,因为卷不再安装。但不安装卷是我能够让 docker-compose 与远程主机一起工作的唯一方法。我们应该能够让本地和远程主机使用相同的 docker-compose.ymlDockerfile.

工作

如何在不更改 Docker 文件或 docker-compose.yml 的情况下与本地 VM 交互开发并部署到远程 VM?

版本:

Compose 的功能与您在后台使用常规命令行界面所做的几乎相同。所以你的命令大致相当于:

$ docker run --name web -p 5000:5000 -v $(pwd):/code --link redis:redis web

问题是卷是相对于 docker 主机的,而不是客户端。因此它将把工作目录挂载到远程虚拟机上,而不是客户端。在你的例子中,这个目录是空的。

如果您想与远程 VM 进行交互开发,则必须检查源代码并在 VM 上编辑文件。

更新:您似乎真的想在本地开发和测试,然后将生产版本部署到远程 VM。 (如果我仍然误解,请道歉)。为此,我建议您有一个单独的 Compose 文件用于开发,您可以在其中安装本地卷,然后重建并部署映像以用于生产。通过重建映像,它将获取最新版本的代码。在生产环境中安装卷会中断,因为您使用空目录隐藏了映像中的代码。

还值得指出的是,Docker目前不建议在生产中使用 Compose。

我真正想要的是在这个 Using Compose in production doc. By Extending services in Compose 中找到您可以与本地 VM 交互开发并部署到远程 VM,而无需更改 Dockerfile 或 docker -compose.yml.

我 运行 进入这个 "can't open file 'app.py'" 问题,因为我是 运行 Docker 在 Windows 中。我需要确保我在 Docker 设置中共享了包含我的项目目录的驱动器。

来源:见the "Shared Drive" section of Docker Settings in the docs