1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

scrapydにクローラーのプロジェクトを登録してからデーモン化するDockerfile

なにをするの?

 1. サーバーを一時立ち上げ
 2. サーバー初期設定
 3. サーバー一旦終了
 4. CMDでデーモン化

これを一度のビルドで収めようと思います。ニッチなTipsかもしれませんが、サーバー立ち上げないと初期設定できない状況は他でもありそうなのでまとめておきます。

scrapydについて

 
 scrapydは、サーバを立ち上げたあとに管理したいCrawlerプロジェクトを登録(deploy)してあげないといけません。Dockerでscrapydだけ立ち上げて、ホスト側でdeployしてもよいのですが、半自動になるためDockerの魅力が減ってしまいます。サーバー立ち上げ、初期設定、サーバー一旦終了、CMDでデーモン化を一度のビルドで収めようと思います。

コードと説明

全Dockerfileはこちら。
GitHub https://github.com/naronA/docker_news_crawler

Raspberry Piで動かしているのでFROM resin/rpi-raspbianになっていますがDebian系なら大丈夫です。
途中で自作のクローラーをgithubのリポジトリをcloneしていますので、自宅の環境じゃないと動きません。
news_crawlerscrapy.confに設定してあるFTPサーバーアドレスを変えれば動くかも?

以下コードの抜粋です。

WORKDIR /root
RUN git clone https://github.com/naronA/news_crawler news_crawler

WORKDIR /root/news_crawler
RUN pip3 install -r requirements.txt scrapyd scrapyd-client
RUN crontab cron.conf
RUN cp -rf scrapyd.conf /root/scrapyd.conf

RUN cd /root \
    && scrapyd & sleep 10s \
    && cd /root/news_crawler/news_crawler \
    && scrapyd-deploy \
    && curl http://localhost:46800/listprojects.json

EXPOSE 46800

WORKDIR /root
CMD ["/usr/local/bin/scrapyd", "--pidfile="]

 大切なのは cd /root && scrapydして最後にWORDDIR /rootとしているとことろ。scrapydは、起動したディレクトリにdbsディレクトリを作成して設定を保存するので、初期設定とDockerのデーモン化時のディレクトリをあわせる必要があります。
 あとは、scrapydをバックグラウンドにするのでscrapyd & sleep 10sのようにsleep 10sを入れましょう。sleepがないとサーバーが立ち上がる前にdeployしようとしてしまい失敗します。各RUNでshの新しいプロセスが立ち上がり、最後にプロセスが終了するのでscrapydとscrapyd-deployは1つのRUNの中に収めましょう。

もっと賢いやり方があるかもしれませんが、自宅のサーバーはこれで動いております。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?