2015-07-12 68 views
2

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

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。问题在于没有将地址添加到客户端/etc/hosts上,因为我使用的是docker-compose run而不是up

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

回答

2

这是我提出的一个解决方案,这是一个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 
1

我猜你的主要问题是关于重新启动应用程序当有变化代码。

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来做你想做的任何事情。


编辑:新命题考虑到你需要两个互动炮弹,而不是简单的可能性重新启动代码更改的应用程序。

有两个不同的应用程序,你可以为每个应用程序配置一个docker-compose

的从“服务器”的应用程序可以包含这种信息docker-compose.yml(I加入不同种类的配置的示例的):

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启动每个配置。

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

使用此解决方案,可以在相关应用程序的存储库中提交每个docker-compose.yml文件。

+0

谢谢。我喜欢使用Forever的建议。我不喜欢独立运行shell的想法,因为我想观看我的服务器的标准输出。 –

+0

使用'docker compose up'(不带-d选项),您将能够观看标准输出。我提到'docker exec',但它是可选的,只有当你想在容器中执行某些命令时出于任何原因。 –

+0

是的,我在我的问题中提到过,但我想要一个用于服务器和客户端的交互式shell。 –

0

首先要提,为开发环境要利用来自泊坞窗,组成以安装您的应用程序容器当它开始(在运行时)。对不起,如果你已经这样做,但我提到这一点,但从你的定义不明确docker-compose.yml

要回答你的具体问题 - 正常启动你的容器,然后当做​​,你会看到你的名字容器。例如'web_server'和'web_client'(其中web是您的docker-compose.yml文件或项目名称的目录)。

当你得到想要连接到容器的名称,您可以运行此命令在正在运行的服务器的容器正好运行bash下

docker exec -it web_server bash

如果您想了解更多关于建立开发环境相当复杂的应用程序,结账this article on development with docker-compose

+0

谢谢;我不想单独运行一个shell,因为我想从我的服务器上观看stdout。 –