我正在同时开发一个服务器及其客户端,我在Docker容器中设计它们。我正在使用Docker Compose将它们链接起来,它可以很好地用于生产,但是我无法弄清楚如何使它与开发工作流程一起工作,在这个工作流程中,每个人都运行一个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
。这样做的问题是,客户端上的/etc/hosts
没有添加服务器地址,因为我使用的是docker-compose run
而不是up
。
我能解决的唯一解决方案是使用docker run
并放弃Docker Compose进行开发。还有更好的方法吗?
答案 0 :(得分:2)
这是我提出的解决方案,这是一种解决方案;如果你能做得更好,请告诉我。
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 :(得分: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去做你想做的事。
编辑:考虑到您需要两个交互式shell,而不仅仅是在代码更改时重新启动应用程序的可能性。
拥有两个不同的应用程序,每个应用程序都可以配置docker-compose
。
来自"服务器的docker-compose.yml
"应用程序可以包含此类信息(我为示例添加了不同类型的配置):
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文件都可以在相关应用程序的存储库中提交。
答案 2 :(得分:0)
首先要提到的是,对于开发环境,您希望将docker-compose中的卷用于将您的应用安装到容器 #39; s开始(在运行时)。对不起,如果您已经这样做了,我提到了这一点,但从您对docker-compose.yml
要回答您的具体问题 - 正常启动容器,然后在执行docker-compose ps
时,您会看到容器的名称。例如' web_server'和' web_client' (其中 web 是docker-compose.yml文件的目录或项目名称。)
当您获得要连接的容器的名称时,可以运行此命令以在运行服务器的容器中运行bash:
docker exec -it web_server bash
。
如果您想了解有关为相当复杂的应用设置开发环境的详情,请查看this article on development with docker-compose