「Docker」タグアーカイブ

dockerizeコマンドで他のDockerコンテナの立ち上げを待つ

「Docker で動くようにすること」(to dockerize)じゃない、ツールの方の dockerize (jwilder さん作)を使って、同じDocker network 内(setup_remote_docker したもの)に立ち上げ中のコンテナの準備ができるのを待たせる方法。

# 名前が紛らわしいのは検索性を低めてると思いますが

どうせならツールも自力でセットアップせずに docker hub にあるものを呼べばよいということで、

docker run jwilder/dockerize -wait http://sample.test/ -timeout 3m -wait-retry-interval 5s

上は、http://sample.test/ が応答を返すまで、最大3分間、5秒おきに問い合わせ。

CircleCI の中で待ちたかった(コンテナの立ち上げが終わってからテストを流す)ので、ターゲットのコンテナと同じ Docker network でこれを呼ぶと、.circleci/config.yml は

    - steps:
       (中略)
      - run:
          name: Run Docker Containers
          command: docker-compose up -d
      - run:
          name: Wait until the target docker container fully set up
          command: |
            docker run --network my_network \
              jwilder/dockerize -wait http://my_service/about/ -timeout 3m -wait-retry-interval 5s
      - run:
          name: テストとか

こんな感じでいけました。

CircleCI公式のDocker image には dockerize も入ってる

しかし、その後、CircleCIの用意してくれているDockerベースのDocker Container を使う場合、そのコンテナには Docker だけでなく Docker Compose や Dockerize も含まれているということに気づきました。

「あれ? じゃ上のコード無意味で、直接 dockerize を呼べばいいだけでは?」と思い直し、これを試してみたのですが、

      - run:
          name: Wait until docker container fully set up, from the same docker network
          command: |
            dockerize -wait http://my_service/api/doc -timeout 3m -wait-retry-interval 10s

ネットワークが違うのでアクセスできません。そりゃそうか。CircleCIの中で立ち上がったDocker MachineのIPアドレスが取れれば、それでアクセスできそうだけど。

ドキュメントにありました。同じコンテナか、同じネットワークのコンテナからのアクセスとするのが正しいやり方のようです。CircleCIが使ってるprimary のコンテナにはもう Dockerize コマンドの実体があるので、同じものを再度リモートから取得するのはもったいない気もしますが。

sleepでwait

CircleCI のドキュメントのサンプルでも

      - run:
          command: |
            git push heroku fan-in-fan-out:master
            heroku run rake db:migrate
            sleep 5 # sleep for 5 seconds to wait for dynos
            heroku restart

みたいなことが書いてあって、”sleep 5″って、それいつでも大丈夫なの? と思ったので調べました。まあサンプルはサンプルなので。

Docker+Traefikで同一ホストのサブフォルダとルートフォルダで別バックエンドを見に行かせる

Traefik をリバースプロキシにしてアクセスをバックエンドの Docker コンテナに振り分ける実験をしていたのですが、http://example.com/app1 と http://example.com/app2 をコンテナ app1 と app2 に振り分けることは無事できたものの、http://example.com/ へのアクセスがどちらにもいかず404になってしまいました。

docker-compose.yml の label で Traefik の動作指定をしていたのですが、どちらかの app に / を含めてしまうと、/ を書いた方の定義が優先されてしまい、もう一方のサブフォルダが振り分けされなくなってしまいました。

では、/ を含む方の定義に2つの条件を書けばいいのでは、と思いましたが、一行の中にセミコロンで複数条件を書くのは、それらの AND を表していて、OR にはなりません。それでは、と、二つの条件を2行に並べて書くと、後で書いた方だけが有効になるよう。

公式の github project を検索すると、ラベルにサービス名をつけることで複数の条件を OR で指定できるようです。

Allow multiple rules from docker labels containers with traefik.<servicename>.* properties by benoitf · Pull Request #1257 · containous/traefik

この修正が今年の3月で、version 1.3.0 に入っている。ということは使えるということ。

マジック・ザ・GIFニング – 面白動画を載せたMtGのカードを生成するプログラム

カードゲーム「マジック・ザ・ギャザリング(MtG)」のデータを使ったネタプログラミングが Hacker News で話題となっていました。

Pythonで書かれ、GitHubで公開されているこのツールは、MtGのカードのタイトルに合った内容のアニメーションGIFを埋め込んで、MtGのパロディカードを生成するというプログラム。

生成したカードを定期的にツイッターにつぶやく bot 機能も持っていて、作者自身によるデモアカウント@MTGIFening では、6時間おきに一枚、新作カードが自動投稿されています。

ハウル・フロム・ビヨンド(彼方からの雄叫び)というカード名から生成されたのが、こちらのカード

なるほど、雄たけんでるように見えなくもない。

仕組み

Readme/ソースによれば、このツールの仕組みはこんな感じ。

カードデータの入手

MTG JSONで提供されている、全カードのJSONデータを取得する。そんなデータが有志によって管理されているんですね。これもGitHub上で管理更新されているようです。日本語データファイルもありました

ここからJSONファイルをダウンロードし、それを前処理のスクリプトで必要なレコードのみのcsvを作り、それを使って動いています。

ネタになるアニメーションGIFの入手

アニメーションGIF版 YouTube、みたいなサイトGIPHYAPIが提供されていて、その中にキーワード検索APIもあるので、ランダムに選んだMtGのカードのタイトルを食わせています。タイトルによってはGIFが見つからない場合もあるみたいですが、その時は見つかるまで繰り返しています。

“MtG”で検索して最初にでてきたのがこれ。

Giphy sample

オリジナルのカード画像に、GIFをはめ込む

MtG公式からカード画像を取得し、MoviePyライブラリで、動画の各フレームを書き換えているようです。カードの世代によって画像の位置やサイズが違うので、世代にあわせて埋め込み座標を変えたりもしています。

ツイートする

PythonでTwitterを読み書きするTwythonを使い、生成されたGIFをツイッターに投稿させています。

これらをパッケージする Docker ファイルも置いてあり、自分の環境で簡単に再現できます。ツイッターに投稿するところは動かしませんでしたが、ローカルで動かしてみてできた画像がこちら。

コードも完結で短く、データやAPIを組み合わせてうまく作ってるなと思いました。

via Hacker News

[メモ] Docker + Spress で静的サイトを作る

PHP製の静的サイトジェネレーター Spress を、Windows 上で Docker で実行しました。

ソース

PHP製の静的サイトジェネレーターSculpinを使ってみたのですが、開発が思ったほどアクティブでなさそうなのと、Spress が Sculpin の影響を受けた後継者である、みたいなことを言っている人がいたので、こちらも試すことにしました。

今回も、Docker Compose を使ったセットアップのメモを、Spress自身を使って静的ブログにしてみました。

SpressをDocker(+Compose)で動かす

しかし、日本語のタグやカテゴリーに対してファイルを生成しないので、非ヨーロッパ諸語に関してはSculpinよりも手入れが必要という印象でした。slugを作るところの関数が、UTF-8一般には対応しておらず、マッピングテーブルを使ってウムラウト等を消しているだけ。

[メモ] Docker + Sculpin で静的サイトを作る

PHP製の静的サイトジェネレーター Sculpin を、Windows 上で Docker で実行しました。

ソース

サンプルのテーマを派生させて差分で日本語+自分用のテーマを作ろうとしたけど、theme の仕組みはまだ実験的です、とある通り、サンプルテーマもテーマ内のアセット読み込みに対応してなかったりまだまだでした。

セットアップのメモをSculpin自身を使って静的ブログにしてみました。

Home — Docker ComposeでSculpinを動かすブログ — ついでにサンプルテーマを日本語に

使えそうなら自分用で必要な Theme と Bundle を作っていこうかとも思っていましたが、他のツールも触ってみた方がいいかもという結論になりました。

composerize – dockerコマンドラインをdocker-composeの書式に変換してくれるツール

Composerizeは、コマンドラインオプションを持ったDockerコマンドを、Docker Composeの定義ファイルの形式へ変換してくれる、というサービスです。

composerize-screenshot

Dockerコマンドのオプションを列挙してるのが docker-compose.yml なので、コマンドラインパラメーターとymlに掛かれてるものは機能的には一対一に対応してはいるんです。しかし、名前が微妙に違っているパラメーターがあって、コマンドラインで動作確認したものをComposeに移行しようとした際にエラーが出てしまい、両方のマニュアルを開きながら調べて修正、など僕も苦労してました。

Githubで公開されているソースの(コンバート部分を見れば、パラメーターの名前が微妙に違うものが多いのに気づきます)

デバッグ時には反対向きの変換ツールもあるといいかも。

via reddit