docker-compose up 不向远程容器添加代码

标签 docker docker-compose

我已经完成了最初的 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它有效!

    让我们在 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?

    版本:
  • Docker 1.7.0
  • Docker Compose 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 上的文件。

    更新:看来您实际上想在本地进行开发和测试,然后将生产版本部署到远程 VM。 (如果我仍然误解,请道歉)。为此,我建议您有一个单独的 Compose 文件用于开发,您可以在其中安装本地卷,然后重建和部署镜像以进行生产。通过重建镜像,它将获取最新版本的代码。在生产中挂载卷会中断,因为您使用空目录隐藏了镜像中的代码。

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

    关于docker-compose up 不向远程容器添加代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971083/

    相关文章:

    docker - 消耗一定内存时重启docker

    docker - 要发布的私有(private) docker 容器

    amazon-web-services - 错误 : The Compose file './docker-compose.yml' is invalid because: services. jenkins.networks 包含无效类型

    Docker compose - 从另一个容器调用服务时名称或服务未知

    docker - kafka zookeeper docker没有连接

    performance - 如何优化 docker 容器的性能?

    ruby-on-rails - 通过 gitlab ci/docker 运行构建

    postgresql - 传输 Docker 运行脚本以编写文件 - postgres 不运行?

    amazon-web-services - 启动 ec2 服务器时自动启动 docker

    docker - 无法在 Docker 中将 nodetool 命令和 cqlsh 运行到 Scylla