簡體   English   中英

使用Docker Compose引用服務

[英]Referencing services with Docker Compose

我有問題調用我的“主”( web )服務中的某些Docker Compose服務中應該定義的內容。 我有以下docker-compose.yml文件:

version: '2'

services:
 db:
   image: postgres
   volumes:
    - postgres-db-volume:/data/postgres
 pdftk:
   image: mnuessler/pdftk
   volumes:
    - /tmp/manager:/work
 ffmpeg:
   image: jrottenberg/ffmpeg
   volumes:
    - /tmp/manager:/files
 web:
   build: .
   command: python manage.py runserver 0.0.0.0:8000
   volumes:
     - .:/code
     - /tmp/manager:/files
   ports:
     - "8000:8000"
   depends_on:
     - db
     - pdftk
     - ffmpeg

volumes:
   postgres-db-volume:

我能夠完美地使用來自web db ,但遺憾的是不是pdftkffmpeg (這些只是在運行web的shell時未定義的命令行實用程序):

manager$ docker-compose run web bash
Starting manager_ffmpeg_1
Starting manager_pdftk_1
root@16e4b755172d:/code# pdftk
bash: pdftk: command not found
root@16e4b755172d:/code# ffmpeg
bash: ffmpeg: command not found

如何在web服務中定義pdftkffmpeg depends_on是不是適當的指令? 我應該擴展web的Dockerfile來調用入口點腳本來安裝其他兩個服務中找到的內容(即使這看起來會適得其反)?

嘗試在添加pdftkffmpeg后刪除並重建web服務,但這並沒有解決它。

我能做什么?

謝謝!

看起來像是對“depends_on”的誤解。 它用於設置容器的起始順序。

例如:在Webserver等之前啟動數據庫

如果要訪問安裝在其他容器中的工具,則必須打開ssh連接,例如:

ssh pdftk <your command>

但我會將nessecary工具安裝到Web容器映像中。 擴展Dockerfile以安裝這兩個工具應該做的伎倆。

編輯:下面描述的方法不適用於OP的問題。 仍然把它留在這里作為教育信息


除了@opHASnoNAME描述的選項之外......您可以嘗試為pdftkffmpeg聲明容器卷並直接使用二進制文件,如下所示:

ffmpeg:
  volumes:
    - /usr/local/bin

並將其掛載到您的Web容器上:

web:
  volumes_from:
    - ffmpeg

請注意,此方法有一些限制:

  • ffmpeg掛載的路徑/usr/local/bin不應存在​​於web中,否則您可能只需要掛載文件。
  • web/usr/local/bin必須在$PATH
  • 因為這是二進制文件的熱鏈接,這可能會由於不同的Linux版本,缺少共享庫等而失敗... - 所以它實際上只適用於獨立的二進制文件
  • 使用volumesvolumes_from所有容器必須部署在同一主機上

但我仍然在這里和那里使用它,即使用dockerdocker-compose二進制文件。

要訪問“工具”,您不需要安裝SSH,這很可能非常復雜,不需要。 使用depends_on時,容器不會“合並為一個”。

Depends_on甚至比啟動訂單更少,它更多的是“ruff容器啟動順序。例如,即使應用程序取決於數據庫,也會發生,當應用程序已經啟動時,數據庫容器進程尚未完全啟動 - 依賴於現在是,在大多數情況下,用於在容器需要重新初始化時通知,當他依賴的其他容器例如重新創建時。

除此之外,啟動容器並將docker-socket安裝到其中。 添加這個:

services:
web:   
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

現在,在需要安裝docker的Web服務器上,您可以執行以下操作:

docker exec pdftk <thecommand>

這是在服務上運行命令的常用方法。

您當然可以使用基於http / api的實現,在這種情況下,您不需要公開任何端口或掛載套接字,更多,您可以使用其服務名稱訪問服務

ping pdftkping ffmpeg

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM