docker – 撰写不向远程容器添加代码

我已经完成了Docker Compose的初始概览,并且在本地使用boot2docker工作得很好。 但是,如果我尝试在远程主机上执行docker-compose up ,则不会将代码添加到远程容器。

重现:

  1. 完全按照书面方式运行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 ,它的作品!

让我们再试一次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.ymlDockerfile来获得本地和远程主机的工作。

如何与本地虚拟机交互开发并部署到远程虚拟机而无需更改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设置”的“共享驱动器”部分