使用Docker Compose引用服务
我有问题调用什么应该从我的“主”( web
)服务的一些Docker撰写服务中定义。 我有以下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
,但不幸的是不是pdftk
或ffmpeg
(这些只是命令行实用程序,当我运行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
服务中定义pdftk
和ffmpeg
? 是depends_on
不是适当的指令? 我应该扩展web
的Dockerfile来调用一个入口点脚本来安装在其他两个服务中find的内容(尽pipe这似乎适得其反)。
尝试删除和重新生成后,添加pdftk
和ffmpeg
的web
服务,但没有解决它。
我能做什么?
谢谢!
看起来像是“依赖”的误解。 它用于设置容器的起始订单。
例如:在Web服务器之前启动数据库等
如果您想要访问安装在其他容器中的工具,则必须打开一个ssh连接,例如:
ssh pdftk <your command>
但我会安装nessecary工具到Web容器的图像。 扩展Dockerfile安装这两个工具应该做的伎俩。
要访问“工具”,你不需要安装SSH,这很可能是相当复杂的,而不是想要的。 使用depends_on时,容器不会“合并为一个”。
Depends_on的启动顺序更less,它的“ruff”容器启动顺序,例如,尽pipe应用程序依赖于数据库,但是在启动应用程序时,db容器进程还没有完全启动 – 现在依赖项是,在大多数情况下,而是用来通知何时一个容器需要重新初始化时,他所依赖的其他容器例如是否被重新创build。
除此之外,启动您的容器并将docker-socket安装到它们中。 添加这个:
services: web: volumes: - /var/run/docker.sock:/var/run/docker.sock
现在,在Web服务器上,您需要安装Docker,您可以:
docker exec pdftk <thecommand>
这是在服务上运行命令的常用方式。
您当然可以使用基于http / api的实现,在这种情况下,您不需要公开任何端口或装入套接字,更多地,您可以使用其服务名称访问服务
ping pdftk
或ping ffmpeg
编辑:下面描述的方法,不适用于OP的问题。 仍然留在这里作为教育信息 。
除了@opHASnoNAME描述的选项之外,你可以尝试为pdftk
和ffmpeg
声明容器卷,并直接使用二进制文件,如下所示:
ffmpeg: volumes: - /usr/local/bin
并将其挂载到Web容器上:
web: volumes_from: - ffmpeg
请注意,这种方法有一些限制:
- 从
ffmpeg
挂载的path/usr/local/bin
不应该存在于web中,否则您可能只需要挂载这些文件。 - 在
web
,/usr/local/bin
必须位于$PATH
。 - 因为这是有限的二进制链接,这可能会失败,由于不同的Linux版本,缺less共享库等… – 所以它实际上只适用于独立的二进制文件
- 所有使用
volumes_from
和volumes_from
容器都必须部署在同一台主机上
但是我仍然使用这个和那里,即与docker
或docker-compose
二进制文件。