Dockerizing Scrapy - точка входа в терапию не получает командных аргументов - PullRequest
0 голосов
/ 18 января 2020

(я довольно новичок в Docker здесь.) Я пытаюсь докеризировать приложение Scrapy . В качестве первого шага я пытаюсь запустить проект в контейнере - который создает и заполняет структуру каталогов - и присоединить том к каталогу проекта для целей редактирования.

Сначала мне нужно позвонить scrapy startproject myScraper; тогда я бы хотел вызывать пользовательские команды, такие как scrapy shell или scrapy crawl myCrawler, для запуска веб-сканирования.

Поскольку все команды Scrapy начинаются с вызова scrapy, я написал этот Dockerfile:

    FROM python:3
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    ENTRYPOINT scrapy      #or so I thought was right ...

, где requirements.txt - это просто Scrapy. Теперь у меня есть пара проблем. Во-первых, ENTRYPOINT, похоже, не работает - в частности, когда я запускаю

    docker build -t scraper .
    docker run -it -v $PWD:/scraper --name Scraper scraper [SOME-COMMAND] 

, я просто возвращаюсь в меню помощи по использованию scrapy. (Например, если SOME-COMMAND равно shell или startproject scraper.) Я пробовал несколько вариантов безуспешно. Во-вторых, если контейнер останавливается, я не уверен, как запустить его снова (например, я не могу передать команду на docker start -ai Scraper).

Часть причины, по которой я пытаюсь это сделать Здесь команды, а не RUN и VOLUME в Dockerfile, заключаются в том, что если том создается в процессе сборки, он скрывает каталог проекта, а не копирует его содержимое из контейнера на том хоста. (То есть я получаю копию моего пустого каталога хоста в контейнере вместо заполненного каталога, настроенного с помощью scrapy startproject volumeDirectory.)

Я посмотрел мою проблему и знаю, что, возможно, не в курсе с правильным Docker, но на самом деле такое чувство, что я спрашиваю, должно быть возможным здесь.

1 Ответ

0 голосов
/ 18 января 2020

Рекомендую удалить строку ENTRYPOINT; Вы можете сделать его по умолчанию CMD, если хотите. Затем вы можете запустить

docker run -it -v $PWD:/scraper --name Scraper scraper scrapy ...

Ваша настоящая проблема здесь в том, что если вы используете ENTRYPOINT (или CMD или RUN) с пустой строкой, как вы показываете, она автоматически получает в sh -c. Затем команда, которую вы передаете в командной строке, объединяется с точкой входа , и в конечном итоге вы получаете в качестве команды основного контейнера

/bin/sh -c 'scrapy' '[some-command]'

, поэтому оболочка запускается scrapy без аргументы, но если эта строка содержит $1 или подобные позиционные параметры, они могут быть заполнены из параметров команды.

Если вы добавите явный JSON -array синтаксис затем Docker не добавит оболочку sh -c, и предложенный вами синтаксис будет работать

ENTRYPOINT ["scrapy"]

, но ряд других распространенных задач не будет работать. Например, вы не можете легко получить отладочную оболочку

# Runs "scrapy /bin/bash"
docker run --rm -it scraper /bin/bash

, а использование --entrypoint для перезаписи приводит к неудобным командным строкам

docker run --rm --entrypoint /bin/ls scraper -lrt /scraper
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...