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

Eve*_*ews 5 docker docker-compose

我完全按照编写的方式完成了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
Run Code Online (Sandbox Code Playgroud)

什么地方出了错?

composetest $ docker logs 794c90928b97
python: can't open file 'app.py': [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

我们可以证实吗?

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
.  ..
Run Code Online (Sandbox Code Playgroud)

空空如也.我们能解决吗?

评论卷 docker-compose.yml

web:
  build: .
  ports:
   - "5000:5000"
  # volumes:
  #  - .:/code
  links:
   - redis
redis:
  image: redis
Run Code Online (Sandbox Code Playgroud)

然后就行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
...
Run Code Online (Sandbox Code Playgroud)

Flask应用程序确实有效,但它有一个严重的问题.如果更改app.py,则Flask dev服务器不会重新加载,并且不会自动看到这些更改.即使您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

Adr*_*uat 5

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

$ docker run --name web -p 5000:5000 -v $(pwd):/code --link redis:redis web
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Eve*_*ews 0

我真正要寻找的是在生产文档中使用 Compose中找到的。通过在 Compose 中扩展服务,您可以与本地虚拟机进行交互开发并部署到远程虚拟机,而无需更改 Dockerfile 或 docker-compose.yml。