Python 停靠Scrapy-Scrapy入口点未接收命令参数
(我是这里的Docker新手。)我正在尝试对应用程序进行Docker化。作为第一步,我尝试在容器中启动一个项目——创建并填充一个目录结构——并将一个卷附加到项目目录以进行编辑 首先我需要调用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
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