LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-16

なにをするの?

 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の中に収めましょう。

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1