我已经完成了最初的 Overview of Docker Compose完全按照所写,它在本地使用 boot2docker 工作得很好。但是,如果我尝试做一个 docker-compose up
在远程主机上,它不会将代码添加到远程容器。
重现:
docker-machine create --driver my-favourite-cloud composetest
eval "$(docker-machine env composetest)"
docker-compose up
在原始代码上。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
它有效!让我们在 boot2docker 上再试一次。
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
同样,仍然没有看到变化。我意识到我们失去了这个 必备 功能,因为该卷不再安装。但不安装卷是我能够让 docker-compose 与远程主机一起工作的唯一方法。我们应该能够让本地和远程主机使用相同的 docker-compose.yml
工作。和 Dockerfile
.如何与本地 VM 交互开发并部署到远程 VM,而无需更改 Dockerfile 或 docker-compose.yml?
版本:
最佳答案
Compose 所做的事情与您在后台使用常规命令行界面所做的事情几乎相同。所以你的命令大致相当于:
$ docker run --name web -p 5000:5000 -v $(pwd):/code --link redis:redis web
问题是卷是相对于 docker 主机,而不是客户端。所以它将在远程 VM 上挂载工作目录,而不是客户端。在你的情况下,这个目录是空的。
如果要与远程 VM 进行交互开发,则必须检查源代码并编辑 VM 上的文件。
更新:看来您实际上想在本地进行开发和测试,然后将生产版本部署到远程 VM。 (如果我仍然误解,请道歉)。为此,我建议您有一个单独的 Compose 文件用于开发,您可以在其中安装本地卷,然后重建和部署镜像以进行生产。通过重建镜像,它将获取最新版本的代码。在生产中挂载卷会中断,因为您使用空目录隐藏了镜像中的代码。
还值得指出的是,Docker 目前不建议在生产中使用 Compose。
关于docker-compose up 不向远程容器添加代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971083/