「メモ」タグアーカイブ

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 に入っている。ということは使えるということ。

ブログでチャット風の会話を表示するCSS

先日の記事「電話番号間違ってますよ」がどうしても信じてもらえない! 内で、チャットのやりとりを表現したかったので、フキダシ会話っぽく見える CSS を書きました。

WordPress の場合は、[外観]-[カスタマイズ]-[追加CSS]に貼りつけてください。特定のポストでだけ使いたい場合は .post-9067 とかを全部の前につけます。

アイコンの画像はこのCSSの中に URL を書き込んであります。別のアイコンにしたければそこを変えてください。


.akky_conv {
padding-top: 1em;
}
.akky_conv li {
display: flex;
flex-direction: row;
max-width: 95%;
}
.akky_conv li div {
width: 32px;
height: 32px;
box-shadow: 2px 2px 0px #aaa;
flex-shrink: 0;
flex-grow: 0;
z-index: 1;
}
.akky_conv li:not(.me) div {
background:url('/akky/wp-content/uploads/2017/04/user-alt-1_0.png') center no-repeat;
background-color: #fcf;
}
.akky_conv li.me {
justify-content: flex-end;
}
.akky_conv li.me div {
background:url('/akky/wp-content/uploads/2017/04/user-alt-2.png') center no-repeat;
background-color: #cff;
order: 2;

position: relative;
bottom: -3em;
}
.akky_conv li p {
background-color: #ddd;
margin: 1em;
padding: 1em;
position: relative;
text-align: center;
}
.akky_conv li.me p{
order: 1;
}
/* 吹き出し */
.akky_conv li p:before {
content: "";
display: block;
width: 0;
height: 0;
position: absolute;
}
.akky_conv li:not(.me) p:before {
border-right: 12px solid #ddd;
border-bottom: 12px solid transparent;
top: 0px;
left: -12px;
}
.akky_conv li.me p:before {
border-left: 12px solid #ddd;
border-top: 12px solid transparent;
bottom: 0px;
right: -12px;
}

会話の方はこんなかんじ。右の発言の人には、li 要素に me クラスをつけます。


<ul class="akky_conv">
<li>
<div></div>
<p>左の人の発言</p>
</li>
<li class="me">
<div></div>
<p>右の人の発言と思いねえ</p>
</li>
</ul>

その結果

  • 左の人の発言

  • 右の人の発言と思いねえ