使用Docker Compose开发服务器和客户端的工作stream程?

我正在开发一个服务器和它的客户端,我正在devise他们在docker集装箱。 我使用Docker Compose将它们连接起来,它对于生产来说工作得很好,但我无法弄清楚如何使它与一个开发工作stream一起工作,在这个工作stream中我已经为每个工作stream运行了一个shell。

docker-compose-devel.yml

 server: image: node:0.10 client: image: node:0.10 links: - server 

我可以做docker-compose up client ,甚至是docker-compose run client但是我想要的是为服务器和客户端运行的shell,所以我可以对迭代进行快速更改。

我希望能够在一个窗口中执行docker-compose run server bash ,并且docker-compose run --no-deps client bash在另一个窗口中docker-compose run --no-deps client bash 。 这个问题是服务器没有地址被添加到/etc/hosts客户端上,因为我使用的是docker-compose run而不是up

我唯一能find的解决scheme是使用docker run并放弃Docker Compose进行开发。 有没有更好的办法?

这是一个解决scheme,我想出了这是hackish; 如果你能做得更好,请告诉我。

docker-compose-devel.yml

 server: image: node:0.10 command: sleep infinity client: image: node:0.10 links: - server 

在窗口1中:

 docker-compose --file docker-compose-dev.yml up -d server docker exec --interactive --tty $(docker-compose --file docker-compose-dev.yml ps -q server) bash 

在窗口2中:

 docker-compose --file docker-compose-dev.yml run client bash 

我猜你的主要问题是在代码发生变化时重新启动应用程序。

Personnaly,我永远使用开发容器启动我的应用程序。

 forever -w -o log/out.log -e log/err.log app.js 

w选项在代码发生变化时重新启动服务器。

我使用.foreverignore文件来排除某些文件上的更改:

 **/.tmp/** **/views/** **/assets/** **/log/** 

如果需要的话,我也可以在运行的容器中启动一个shell:

 docker exec -it my-container-name bash 

这样,您的两个应用程序可以独立重新启动,而无需自行启动这些命令。 而且你有可能打开一个shell来做任何你想做的事情。


编辑:考虑到您需要两个交互式shell而不是简单地重新启动代码更改应用程序的新命题。

有两个不同的应用程序,你可以有一个docker-composeconfiguration每个。

从“服务器”应用程序docker-compose.yml可以包含这种信息(我为示例添加了不同types的configuration):

 server: image: node:0.10 links: - db ports: - "8080:80" volumes: - ./src:/src db: image: postgres environment: POSTGRES_USER: dev POSTGRES_PASSWORD: dev 

来自“客户端”应用程序docker-compose.yml可以使用external_links连接到服务器。

 client: image: node:0.10 external_links: - project_server_1:server # Use "docker ps" to know the name of the server's container ports: - "80:80" volumes: - ./src:/src 

然后,使用docker-compose run --service-ports service-name bash使用交互式shell启动每个configuration。

或者, extra-hosts密钥也可以通过调用服务器应用程序抛出主机上暴露的端口来实现。

有了这个解决scheme,每个docker-compose.yml文件都可以在相关应用程序的存储库中进行提交。

首先要提到的是,对于开发环境,您希望利用docker-compose中的 将应用程序启动( 在运行时挂载到容器 。 对不起,如果你已经这样做,我提到这一点,但是从你docker-compose.yml定义是不明确的

要回答您的具体问题 – 正常启动您的容器,然后在执行docker-compose ps ,会看到容器的名称。 例如“web_server”和“web_client”(其中web是您的docker-compose.yml文件或项目名称的目录)。

当你得到你要连接的容器的名字时,你可以运行这个命令来正确运行运行你的服务器的容器中的bash:

docker exec -it web_server bash

如果您想了解更多关于为复杂的应用程序设置开发环境的信息,请查看Docker-compose开发的这篇文章