У меня проблема с этим докер-составом
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: None python_1 | [2018-06-15 15: 08: 39,487: INFO/Beat] Планировщик: Отправка должной задачи добавляет каждые 10 (cron.run_cron)
но если я перейду вручную к докеру
docker exec -i -t 1ff/bin/bash
Я нашел php в каталоге
Бинарники из контейнера "приложение" не отображаются в контейнере "python", это докер MO. Чтобы запустить скрипт index.php
вы можете открыть эту страницу через http-запрос: curl http://app/index.php
или сделать то же самое в python через urllib2
или requests
(рекомендую последний вариант).
Но в случае неудачи вашего запроса, поскольку он не может найти домен app
- исходный ответ ниже - ваше решение.
Если вам нужно выполнять более сложные операции внутри контейнера app
вы должны действительно подумать об экспонировании их через внутренний API или что-то в этом роде, но, насколько я понимаю, контейнеры докеров должны делать только одно и только одно. Если вам нужно запустить сложный сценарий оболочки в вашем контейнере php, вы нарушите этот принцип. контейнер app
предназначен для обслуживания php-страниц, поэтому он должен делать именно это.
В крайнем случае вы можете полностью взломать докер, например, разоблачить гнездо управления докером внутри вашего контейнера из сельдерея и напрямую отправить команды другим контейнерам. Это может быть действительно опасно и сильно обескуражено в документах, но вы это делаете;)
[РЕДАКТИРОВАТЬ: изначально неверный вопрос...]
В стандартной докере сети вы не можете обращаться к контейнерам по имени. добавлять
networks:
my-net:
до конца состязания докеров и
networks:
- my-net
для каждого контейнера, который должен разговаривать друг с другом.