Запустите php в докере Python

1

У меня проблема с этим докер-составом

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 в каталоге

Теги:
docker
docker-compose
celery

1 ответ

0

Бинарники из контейнера "приложение" не отображаются в контейнере "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

для каждого контейнера, который должен разговаривать друг с другом.

  • 0
    Если я это сделаю, я покажу бинарный файл PHP?
  • 0
    О, извините, я не правильно прочитал вашу ошибку ... проблема в том, что бинарный файл php находится внутри контейнера "app", а задание сельдерея выполняется внутри контейнера "python". К сожалению, вы не можете выполнять команды в других контейнерах, не нарушая семантику докера.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню