docker – 撰写不向远程容器添加代码
我已经完成了Docker Compose的初始概览,并且在本地使用boot2docker工作得很好。 但是,如果我尝试在远程主机上执行docker-compose up
,则不会将代码添加到远程容器。
重现:
- 完全按照书面方式运行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
,它的作品!
让我们再试一次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 dev服务器不会重新加载,而且这些更改不会自动显示。 即使你停下了集装箱docker-compose up
再次docker-compose up
起来,仍然没有看到变化。 我意识到我们失去了这个重要的function,因为音量不再安装。 但是不安装音量是我能够得到docker-compose与远程主机一起工作的唯一方法。 我们应该能够使用相同docker-compose.yml
和Dockerfile
来获得本地和远程主机的工作。
如何与本地虚拟机交互开发并部署到远程虚拟机而无需更改Dockerfile或docker-compose.yml?
版本:
- Docker 1.7.0
- Docker Compose 1.3.0
- docker机0.3.0
撰写只是做了几乎相同的事情,你可以做的常规命令行界面下。 所以你的命令大致相当于:
$ docker run --name web -p 5000:5000 -v $(pwd):/code --link redis:redis web
问题是卷是相对于docker主机,而不是客户端。 所以它将挂载在远程VM上的工作目录,而不是客户端。 在你的情况下,这个目录是空的。
如果要与远程虚拟机进行交互式开发,则必须检出源并编辑虚拟机上的文件。
更新:看来你真的想在本地开发和testing,然后将生产版本部署到远程虚拟机。 (如果我仍然误解,请道歉)。 要做到这一点,我build议你有一个单独的撰写文件的地方卷挂载本地卷,然后重build和部署的图像进行生产。 通过重build图像,它将拾取最新版本的代码。 在生产中安装卷会因为您已将图像中的代码隐藏在空目录中而中断。
同样值得指出的是,Docker目前不build议在生产环境中使用Compose。
我真正需要的是在生产文档中使用Compose 。 通过在Compose中扩展服务,您可以与本地VM交互式开发,并部署到远程VM,而无需更改Dockerfile或docker-compose.yml。
我遇到了这个“无法打开文件”app.py“”问题入门教程,对我来说,这是因为我在Windows中运行Docker。 我需要确保在Docker设置中共享包含我的项目目录的驱动器。
来源:请参阅文档中的“Docker设置”的“共享驱动器”部分