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

时间:2015-06-22 01:42:51

标签: docker docker-compose

我完全按照书面编写了初始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
  4. 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.ymlDockerfile来使本地和远程主机都能正常工作。

    如何与本地VM交互式开发并部署到远程VM而无需更改Dockerfile或docker-compose.yml?

    版本:

    • Docker 1.7.0
    • Docker Compose 1.3.0
    • Docker Machine 0.3.0

3 个答案:

答案 0 :(得分:5)

Compose与您在常规命令行界面下可以做的几乎完全相同。所以你的命令大致相当于:

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

问题是卷是相对于docker主机而不是客户端。因此它将工作目录挂载在远程VM上,而不是客户端上。在您的情况下,此目录为空。

如果要与远程VM进行交互式开发,则必须检查源并编辑VM上的文件。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我遇到了这个"无法在“入门”教程后打开文件' app.py' 问题,对我而言因为我在Windows中运行Docker。我需要确保我在Docker设置中共享包含项目目录的驱动器。

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