2015-07-12 34 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。 –

相關問題