なにをするの?
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の中に収めましょう。
もっと賢いやり方があるかもしれませんが、自宅のサーバーはこれで動いております。