Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 停靠Scrapy-Scrapy入口点未接收命令参数_Python_Docker_Scrapy - Fatal编程技术网

Python 停靠Scrapy-Scrapy入口点未接收命令参数

Python 停靠Scrapy-Scrapy入口点未接收命令参数,python,docker,scrapy,Python,Docker,Scrapy,(我是这里的Docker新手。)我正在尝试对应用程序进行Docker化。作为第一步,我尝试在容器中启动一个项目——创建并填充一个目录结构——并将一个卷附加到项目目录以进行编辑 首先我需要调用scrapy startproject myScraper;然后我想在容器上调用自定义命令,如scrapy shell或scrapy crawl myCrawler,以运行webcrawls 由于所有Scrapy命令都以调用Scrapy开始,因此我编写了以下Dockerfile: FROM pytho

(我是这里的Docker新手。)我正在尝试对应用程序进行Docker化。作为第一步,我尝试在容器中启动一个项目——创建并填充一个目录结构——并将一个卷附加到项目目录以进行编辑

首先我需要调用
scrapy startproject myScraper
;然后我想在容器上调用自定义命令,如
scrapy shell
scrapy crawl myCrawler
,以运行webcrawls

由于所有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.
现在我有几个问题。首先,入口点似乎不起作用——特别是在我运行时

    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

我在这里尝试执行这些命令(而不是作为Dockerfile中的RUN和VOLUME)的部分原因是,如果卷是在构建过程中创建的,那么它会隐藏项目目录,而不是将其内容从容器复制到宿主卷。(也就是说,我在容器中得到一个空主机目录的副本,而不是由
scrapy startproject volumeDirectory
设置的填充目录)


我已经查找了我的问题,知道我可能与适当的Docker偏离了轨道,但我真的觉得我所要求的应该在这里是可能的。

我的建议是删除
入口点
行;如果愿意,可以将其设置为默认的
CMD
。然后你就可以跑了

docker run -it -v $PWD:/scraper --name Scraper scraper scrapy ...
这里您实际的问题是,如果您使用
ENTRYPOINT
(或
CMD
RUN
)和您显示的裸字符串,那么它会被删除。然后在命令行上传递的命令是,最终作为主容器命令得到的是

/bin/sh -c 'scrapy' '[some-command]'
因此,shell运行的
scrapy
没有参数,但是如果该字符串碰巧包含
$1
或类似的位置参数,则可以从命令参数中填充它们

如果您添加了,那么Docker将不会添加
sh-c
包装器,并且您建议的语法将起作用

ENTRYPOINT ["scrapy"]
但是其他一些常见的任务将不起作用。例如,您无法轻松获得调试shell

# Runs "scrapy /bin/bash"
docker run --rm -it scraper /bin/bash
使用
--entrypoint
覆盖内容会导致命令行出现问题

docker run --rm --entrypoint /bin/ls scraper -lrt /scraper