使用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-compose
configuration每个。
从“服务器”应用程序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开发的这篇文章