詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Dockerfile を元にコンテナを走らせてローカルにポートを割り当てるところまでを自動化 (boot2docker のラッパ)

……というのを書いてみた。boot2docker によって OSX でもかなり簡単に Docker が使えるようになり、開発に必要なミドルウェアを用意する助けになってくれるけれど、いちいち -p オプションでポート番号を指定するまでもなく、ミドルウェア(コンテナ)によって決まったポートが割り当てられていれば十分、ということもよくある。

そこでこの forward2docker。 以下のようにすると、Dockerfile からイメージを作成し、走らせて、EXPOSE されているポート番号 + 10000 番を割り当てて待ち受けてくれる。

% curl -LO https://raw.github.com/motemen/forward2docker/master/forward2docker
% chmod +x forward2docker
% ./forward2docker path/to/Dockerfile

やっていることは

  1. boot2docker のセットアップ
  2. Dockerfile からイメージの作成
  3. コンテナを起動
  4. boot2docker の VMssh して、Docker コンテナにポートフォワーディング
  5. 終了時にはコンテナを削除

ってな感じ。ポイントは ssh-L オプションを使ってるのと、expect 便利ですねってところです。

動作例

以下のような Dockerfile を用意して:

FROM ubuntu

RUN apt-get update
RUN apt-get -y install python
RUN apt-get clean

EXPOSE 8000

CMD [ "python", "-m", "SimpleHTTPServer" ]

こんな感じに動きます:

% ./forward2docker Dockerfile
[2014-02-12 09:42:38] boot2docker-vm is running.
[forward2docker] boot2docker initialized.
[forward2docker] Building image...
Uploading context 2.048 kB
Uploading context
Step 0 : FROM ubuntu
 ---> 9cd978db300e
Step 1 : RUN apt-get update
 ---> Using cache
 ---> d84a5d48bca3
Step 2 : RUN apt-get -y install python
 ---> Using cache
 ---> ea40812f2a47
Step 3 : RUN apt-get clean
 ---> Running in 333d55cc02c8
 ---> ee7660de7b2e
Step 4 : EXPOSE 8000
 ---> Running in 2f2af35885fc
 ---> 382d08a83e30
Step 5 : CMD [ "python", "-m", "SimpleHTTPServer" ]
 ---> Running in 93368aab402d
 ---> 3e29099a8799
Successfully built 3e29099a8799
[forward2docker] Starting container...
[forward2docker] bbde0dd94e1e25f8d8860366cccf5cb827db7147588eda313bb15b0b3833d1d0: listen on port 18000
[forward2docker] Starting port forwarding...
spawn ./boot2docker ssh -L18000:172.17.0.2:8000 -- echo Success! && docker logs -f bbde0dd94e1e25f8d8860366cccf5cb827db7147588eda313bb15b0b3833d1d0
Warning: Permanently added '[localhost]:2022' (RSA) to the list of known hosts.
docker@localhost's password:
Success!

この時点で、http://localhost:18000/ で Docker 上で動いているウェブサーバにアクセスできます。Ctrl-C で(ssh セッションを)終了させると、最後にコンテナを消しさっておわり。

^CKilled by signal 2.
[forward2docker] Cleaning up container...
% 

はてなブログでエントリの下に同じカテゴリの他のエントリを表示する

f:id:motemen:20140128093351p:plain

ブログとかでよく見るアレです。記事個別ページを開いたとき、エントリの下部にそのエントリと同じカテゴリの他のエントリが表示されるようになります。JavaScript で実装されていて、どなたでもご利用いただけます。

使い方

ブログのデザイン設定 の「フッタ」部に、以下のコードを貼り付けて読み込むだけ。このブログでも現在有効になっているので、どんな風に動くかをご覧ください。スマホには対応してません。サーセン

<script src="http://motemen.github.io/hatenablog-scripts/show-same-category-entries/show-same-category-entries.js"></script>

カスタマイズ(JavaScript が分かる人むけ)

表示される内容をカスタマイズするには、以下の例のようにしてスクリプトを読み込む前に __hatenablog_show_same_category_entries 変数を設定します。

<script>
var __hatenablog_show_same_category_entries = { maxEntries: 2 };
</script>
<script src="http://motemen.github.io/hatenablog-scripts/show-same-category-entries/show-same-category-entries.js"></script>

設定できる項目は以下のとおり。

リポジトリ

motemen/hatenablog-scripts · GitHub に置いてます。どうぞご fork & PR ください。

GitHub Pages に push するシェルスクリプト #git #github

GitHub のプロジェクトごとの GitHub Pages (http://motemen.github.io/git-browse-remote/ とか)は gh-pages ブランチに push すればいいということになってますが(ヘルプ)、git checkout --orphan なんてこんなときくらいしか使わないし、決まりきった手順を毎度やるのもだるい。たとえば middleman を使ってるなら middleman-gh-pages というプラグインがあって、これを使うのも手だけれど、そうでない場合には結局手でやる必要があってこまる。そういうわけで、独立したシェルスクリプトにしてみました。

使い方

% push-gh-pages DIRECTORY

DIRECTORY というのは GitHub Pages に push されるファイルが展開されるディレクトリ(Git で管理されてないことを想定してます)で、たとえば middleman を使っている場合は build/ になります。このディレクトリの内容を、現在いるリポジトリのリモートリポジトリの gh-pages ブランチに push します。

細かく見ていくと、このスクリプトがやることは

  • DIRECTORY が Git リポジトリでない場合は、Git リポジトリにする
  • リモートを設定する
  • gh-pages ブランチをチェックアウトする、なかったら作る
  • git add . してコミットする
  • push する

という風になってます。デフォルトではコミットメッセージが "pages built at e9daa20165c1b701ed3959b60f4d8c5e5b56da13 (master)" みたいになっていて、どの時点で作られた内容かわかるので、便利ですね。

Shell script to setup/push GitHub pages

はてなで一緒に働きませんか?