docker-组成不向远程容器添加代码
docker-compose up not adding code to remote container
我已经 运行 完成了最初的 Overview of Docker Compose 完全按照写的那样,它在本地与 boot2docker 一起工作得很好。但是,如果我尝试在远程主机上执行 docker-compose up
,它不会将代码添加到远程容器。
重现:
- 运行 到开头的 Overview of Docker Compose 与写的完全一样。
- 安装 Docker Machine 并在任何云提供商上启动 Dockerized VM。
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
就可以了!
让我们在 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.yml
和 Dockerfile
.
工作
如何在不更改 Docker 文件或 docker-compose.yml 的情况下与本地 VM 交互开发并部署到远程 VM?
版本:
- Docker 1.7.0
- Docker 撰写 1.3.0
- Docker 机器 0.3.0
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
我已经 运行 完成了最初的 Overview of Docker Compose 完全按照写的那样,它在本地与 boot2docker 一起工作得很好。但是,如果我尝试在远程主机上执行 docker-compose up
,它不会将代码添加到远程容器。
重现:
- 运行 到开头的 Overview of Docker Compose 与写的完全一样。
- 安装 Docker Machine 并在任何云提供商上启动 Dockerized VM。
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
就可以了!
让我们在 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.yml
和 Dockerfile
.
如何在不更改 Docker 文件或 docker-compose.yml 的情况下与本地 VM 交互开发并部署到远程 VM?
版本:
- Docker 1.7.0
- Docker 撰写 1.3.0
- Docker 机器 0.3.0
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