我有一個專案有兩個需要通過 REST 相互通信的微服務。對于每個微服務,我想在我的 Docker 中有一個容器。每個容器都將運行一個 Python 程式(微服務)。
如下所示,我們有一個檔案組織方式的示例。假設這file_1.py是一個微服務,又file_2.py是另一個。對于它們中的每一個,我們都必須啟動一個容器。
app
|_ uwsgi.ini
|_ file_1.py
|_ file_2.py
|_ folder_2
|_ file_3
|_ file_4
要啟動容器,我們使用檔案 uwgi.ini,如下所示:
[uwsgi]
module = file_1
callable = app
master = true
touch-reload = /app/uwsgi.ini
要啟動容器,我們運行以下命令:
sudo docker run -d -v /app:/app -p docker_port:80 --name "container-name" "docker_name"
但是,可以看出,這樣,我們只能為第一個微服務創建一個容器file_1.py,因為在根應用程式內部,我只能uwsgi.ini在檔案夾中擁有一個。并使用上面的命令,它將搜索uwsgi.ini檔案。
我想要做的是uwsgi.ini每個容器都有一個。我見過人們這樣做,重命名uwsgi.ini每個容器;就我而言,它可能是:uwsgi_file_1.ini和uwsgi_file_2.ini。但是當我這樣做時,啟動容器的命令找不到 uswsgi 檔案,因為我已經更改了它。有沒有辦法通過鍵入并運行前面顯示的命令,使其搜索正確的uwsgi.ini檔案?
uj5u.com熱心網友回復:
兩個簡單的選擇:
- 為每個容器制作不同的 Dockerfile,并在其中將每個容器的正確 .ini 檔案復制到名稱中
uwsgi.ini - 使用一個 Dockerfile,但創建一個入口點腳本,該腳本將 ini 檔案名的名稱作為引數,然后在啟動實際的 uwsgi 行程之前對其進行符號鏈接。
可能還有十幾種其他方法可以解決這個問題。
uj5u.com熱心網友回復:
您應該為每個服務創建一個單獨的 Docker 映像。我建議將每個都放在自己的目錄中,甚至可以放在自己的存盤庫中:
app
-- service1
| -- Dockerfile
| -- uwsgi.ini
| -- setup.cfg
| \-- app1.py
|
-- service2
| -- Dockerfile
| -- uwsgi.ini
| -- setup.cfg
| \-- app2.py
|
\-- docker-compose.yml
每個 Dockerfile 都可以相當獨立。我docker-compose.yml在示例中將檔案放在頂層,作為一起啟動服務的簡單方法:
version: '3.8'
services:
service1:
build: ./service1
ports: ['8001:80']
service2:
build: ./service2
ports: ['8002:80']
environment:
- SERVICE_1_URL=http://service1
您建議的docker run命令有一個-v選項,可以/app用主機中的內容覆寫影像的目錄。然后,您建議的解決方案和@vaizki 的答案都涉及對檔案布局進行某種特定于 Docker 或容器的更改;如果您正在運行容器的多個副本,則系結掛載將隱藏更改或導致沖突。我建議洗掉此選項(或等效的 Compose volumes:);使用沒有 Docker 的 Python 虛擬環境進行普通開發。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405688.html
標籤:
