这个docker-compose有问题
version: '3'
services:
app:
image: php:7
command: php -S 0.0.0.0:8000 /app/get_count_of_day.php
ports:
- "8000:8000"
volumes:
- .:/app
composer:
restart: 'no'
image: composer/composer:php7
command: install
volumes:
- .:/app
python:
image: python:3
command: bash -c "pip3 install -r /app/requirements.txt && celery worker -l info -A cron --beat --workdir=/app/python"
links:
- redis
volumes:
- .:/app
depends_on:
- app
redis:
image: 'redis:3.0-alpine'
command: redis-server
ports:
- "6379:6379"
我的芹菜任务
import os
from celery import Celery
from celery.schedules import crontab
os.chdir("..")
app = Celery(broker='redis://redis:6379/0')
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(10.0, run_cron.s(), name='add every 10')
@app.task
def run_cron():
os.system("/usr/local/bin/php index.php")
我的错误是找不到php
python_1 | sh: 1: /usr/local/bin/php: not found python_1 | [2018-06-15 15:08:29,491: INFO/ForkPoolWorker-2] Task cron.run_cron[e7c338c1-7b9c-4d6f-b607-f4e354fbd623] succeeded in
0.003908602000592509s:无 python_1 | [2018-06-15 15:08:39,487:INFO / Beat]调度程序:发送到期任务每10次添加(cron.run_cron)
但是如果我用
手动去码头docker exec -i -t 1ff / bin / bash
我在目录中找到了php
答案 0 :(得分:0)
容器“app”中的二进制文件未在容器“python”中公开,这是docker的MO。要运行index.php
脚本,您可以通过http请求curl http://app/index.php
来打开此页面,或者通过urllib2
或requests
在python中完全相同(我推荐最后一个选项)。
但是如果您的请求因为找不到app
域而失败 - 以下原始答案就是您的解决方案。
如果你必须在app
容器内执行更复杂的操作,你应该考虑通过内部API或类似的东西来暴露它们,但据我所知,docker容器应该做一件事和一件事只要。如果你需要在你的php容器中运行一些复杂的shell脚本 - 你违反了这个原则。 app
容器用于提供php页面,因此它应该完全正确。
作为最后的手段,你可以完全破解docker,例如在你的celery容器中暴露docker control socket并直接向其他容器发出命令。这可能是非常危险的,并且在文档中非常气馁,但你做到了;)
[编辑:最初误读了问题...]
在默认的泊坞窗网络中,您无法按名称寻址容器。添加
networks:
my-net:
到docker-compose和
的末尾networks:
- my-net
每个需要互相交谈的容器。