gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:03:34 24 4
gpt4 key购买 nike

我已经完成了最初的 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com