Dockerfile の RUN instruction で heredoc 記法をそのまま使うとコマンドが non-zero exit status で死んでも docker build が成功してしまう

tl; dr

  • Dockerfile の heredoc 機能の中で凝ったことをやるときはコマンド群の最初に set -e とか書くのが無難そう

近年 Dockerfile 内で heredoc 記法が使えるようになったことが知られていて、

www.docker.com

割と凝ったことができる機能で、シンプルには以下のように RUN にずらずら書くときシュッと書けて便利、というのがわかりやすいと思う。

思うんだけど、こういうふうに heredoc の中でなんかミスってしまったときに何が起こるかというと、

# syntax=docker/dockerfile:1.3-labs
FROM debian

RUN <<EOF
  apt-get install packagewhichdoesnotexists
  ls
EOF

こういう感じで docker build は成功扱いになってしまう。

% docker build --no-cache .
[+] Building 2.2s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                     0.0s
(中略)
 => CACHED [1/2] FROM docker.io/library/debian@sha256:2ce44bbc00a79113c296d9d25524e15d423b23303fdbbe20190d2f96e0aeb251                                                                                                                   0.0s
 => [2/2] RUN <<EOF (apt-get install packagewhichdoesnotexists...)                                                                                                                                                                       0.3s
 => exporting to image                                                                                                                                                                                                                   0.0s
 => => exporting layers                                                                                                                                                                                                                  0.0s
 => => writing image sha256:e62007bb070cd3bacbf16cb21cdca776022865ee5f8a7b7ca4f037dd712f1230                                                                                                                                             0.0s

Debian に packagewhichdoesnotexists パッケージが存在するわけもなく、直感的には docker build が失敗してほしいと思うんだけど、成功扱いになってしまう……。

実装された p-r を見てみると、上記のように RUN に素朴に heredoc を渡した場合は、その中身が sh -c で実行される、という雰囲気になっているように見えた。heredoc の中身がそのままシェルスクリプトとして実行されるようなものと捉えればよいだろうか。

github.com

という話を同僚の id:dekokun さんとしていて、set -e してみたらどうなるかという話になるわけだけど、こうするとしっかり docker build は失敗してくれた。

# syntax=docker/dockerfile:1.3-labs
FROM debian

RUN <<EOF
  set -e
  apt-get install packagewhichdoesnotexists
  ls
EOF
% docker build --no-cache .
[+] Building 3.2s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                     0.0s
(中略)
 => CACHED [1/2] FROM docker.io/library/debian@sha256:2ce44bbc00a79113c296d9d25524e15d423b23303fdbbe20190d2f96e0aeb251                                                                                                                   0.0s
 => ERROR [2/2] RUN <<EOF (set -e...)                                                                                                                                                                                                    0.3s
------
 > [2/2] RUN <<EOF (set -e...):
#9 0.229 Reading package lists...
#9 0.237 Building dependency tree...
#9 0.239 Reading state information...
#9 0.241 E: Unable to locate package packagewhichdoesnotexists
------
executor failed running [/bin/sh -c   set -e
  apt-get install packagewhichdoesnotexists
  ls
]: exit code: 100

完全に忘れてたけどこういう話もある!

Dockerfile の RUN instruction で heredoc 記法を使うときには set -e しないとコマンドが non-zero exit status で死んでも docker build が成功してしまう - polamjaggy nikki

-o pipefail とかも欲しくなるやつ?(わかってない)

2022/07/27 20:05
b.hatena.ne.jp

これも docker build 成功してしまうけど、

# syntax=docker/dockerfile:1.3-labs
FROM debian

RUN <<EOF
  set -e
  apt-get install packagewhichdoesnotexists | cat
  ls
EOF

Debian ではこれは dash で実行されていて、こういう話になってしまう!

Dockerfile 内でこれをやりたい人はいないでしょって感じで厳しい……。

stackoverflow.com

qiita.com

1年間分で43000円くらいのAdobe税を今年も払ってしまった。定常的に使っていると言えるのはLightroom Classic CCくらいで、あとはものすごく稀にIllustrator > Premiere, Audition, Photoshop > Lightroom CC > After Effectsくらいの序列でなんか触るかどうかというくらいで、ソフトウェアの価値そのものというよりは、その気になればこれらをいつでも使える状態であることに金を払っているような気分になる。フォトプランで十分なのでは説がまあまあある……。来年はそうしてしまいそうな気がする。

1年間分の権利に一発で数万円を払うという点に注目すると、最近の買い物のなかだと自動車保険が近くて、決済ボタンを押すときのエイヤ感みたいなのが似てそう。

車買った #la400k

型式 LA400K で知られる現行型のダイハツ コペン ローブ。選んだ基準は以下の通り。


自動車の所有に最初に関心を持ってからだいたい足掛け1年くらい、現行型コペンのカーセンサー新着を熱心に眺めるようになってから2ヶ月くらいでフィニッシュ。他に頭をよぎったカーとしては、ロードスター・ミニコンバーチブル・トゥインゴキャンバストップ・207CC・マイクラC+Cあたり。現実路線として屋根が開かないカーではスイフト・ヤリス・N-ONEあたりも眺めていた。

ディーラー試乗も一度やってみたけど、なぜか神奈川のオリックスレンタカーコペンを普通の料金で借りられるキャンペーンをやっていて *1、それで1日ぶん回せたのが完全に決め手になったと思う。

car.orix.co.jp

ここ半年くらいで都心からやや郊外に引っ越して、関東近郊・東京通勤圏内のベッドタウンでも意外と車社会やんけ!!ということを思い知ったのもアシストポイントだったような気がする、というか、それを狙ってもいたので予定通りではある。


良かった、というか背中を押してくれた記事たち。ゼロカウンタードリフトがどうみたいな話を見ていると、ジムカーナとかやってみないと損なのでは?という気持ちになってきてしまう。さすがにロールバー付けたりするところまではいかないと思うけど……。

response.jp

response.jp

www.itmedia.co.jp

ペダルカーでしょっていうコメントを見て笑ってしまったけど、キャラクター的には褒め言葉になってしまいそうな感じすらある。ペダルカーでスーパーに買い物行くぞ!ってなったら大はしゃぎだと思うけど、そういう感じで (?) そのへんに買い物に行くだけで楽しめる車だと思う。これで ADAS 付く改良が入ったら新車で買ってしまいそうな気がするな……。

*1:定期的に店舗ローテーションしてるみたいなので、リンク切れてたらコペン レンタカーとかで探してみてください

RouterOS + 楽天ひかり クロスパス で DS-Lite だけを設定する (ひかり電話なし)

前提

  • RouterOS 6.49.3
  • 楽天ひかりの IPv6 オプションが有効化済み
  • HGW の 下りポートは Routerboard の ether1 に接続
  • DS-Lite 越しの IPv4 の通信だけが可能な状態を目指す。IPoE 越しの IPv6 通信とのデュアルスタックや PPPoE との併用はターゲットにしない

主に参考にした先人たち:

手順

説明は WebFig 前提です。ごちゃごちゃ試してて、どの順番で設定を変えたらいいかは記憶が曖昧なので、動かなかったらすみません…… (ある設定値を決めるのに別の設定を投入して何かを実行しないといけない、というパスはあるけど、それ以外は基本的に順不同で、正しい設定になっていれば動くだけのはず)

  1. IPv6 > Settings
    • Accept Router Advertisements: yes
  2. IPv6 > DHCP Client > Add New
    • Interface: ether1
    • Request: prefix だけチェック
    • Pool Prefix Length: ひかり電話なしなので 64
  3. Tool > Traceroute
    • Traceroute To: 2001:4860:4860::8888 などと入力して実行する
      • これは 8.8.8.8 の IPv6 版アドレスで、internet reachable な IPv6 アドレスであればなんでもいい
    • # 0 の行 (Hop 1) の Host 列に出ているはずの IPv6 アドレスをメモる。これが ONU から RA で降ってきてるアドレスである
  4. IP > DNS
    • Servers に 2001:4860:4860::8888 とかを入れる
  5. Interfaces > Interface > Add New > IPIPv6 Tunnel
    • Local Address そのまま
    • Remote Address が dgw.xpass.jp
  6. IP > Routes > Add New
    • Dst. Address: 0.0.0.0/0
    • Gateway: ↑ で作った IPIPv6 Tunnel

一通り試行錯誤した後だと、この一文が身に沁みる感じがあって面白かった。

(※) DS-Lite は、IPIPトンネリング(IPv4 over IPv6トンネル接続)を利用して行います。この時、ルーターIPv4パケットをIPv6カプセル化し、IPv6ネットワークに設置された AFTR(Address Family Transition Router)にIPv6パケットを転送します。AFTRにて、カプセル化されたIPv4パケットをIPv6パケットから取り出し、IPマスカレードによる変換を行い、IPv4インターネットへとIPv4パケットを転送します。 — クロスパス(Xpass)接続設定例

なんか接続できてる気がするけど設定が本当に正しいか自信がない……という場合は、Routerboard の再起動をかけてみると見落としていた箇所が明らかになったりすることもあった。


これで回線がどうなったかというと、世間のピーク時間帯 (夜 19 時〜 23 時くらい) で言えばこういう感じ。

  • before (楽天ひかり PPPoE)
    • https://fast.com の結果が下り 10Mbps 以下
    • ping 8.8.8.8 とかで 50ms 前後 + パケロス率 < 10%
  • after
    • https://fast.com 下り 60Mbps 〜 100Mbps くらい
    • ping 8.8.8.8 が 5〜15ms 程度に改善、パケロス率限りなくゼロ

ものすごくマシになったとはいえ、楽天ひかりに変える前に使ってた v6 プラスは下り速度が after の 10 倍くらいは普通に出ていたので、それと比べると、、という感じはしてしまう *1……。

10Mbps の世界はそれはそれは遅いもので、大きめの JPEG 画像が上からビーッと表示されていく様子とか久しぶりに見た、という感じであった。めっちゃ関係ないけど、旅行とかもしばらくろくに行ってないので、はじめて行ったホテルの Wi-Fi でとりあえず SpeedTest を走らせて、遅かったらがっかり……みたいなムーブとも無縁の生活が続いている。

*1:別のルーターを使っていたので単純な比較はできないけど、それでも電気屋で普通に売ってるようなやつだったので、回線の違いが結果に出てるのではないか

クルマについて考えるようになって1年くらい経つけどまだ買ってなくて、とはいえカーシェアやレンタカーでそこそこ運転したことで *1 ペーパードライバーは脱出しつつある気がする。

polamjag.hatenablog.jp

去年の後半くらいの暇なときには Motor Fan illustrated という雑誌が Kindle Unlimited でだいたい全部読める (すごい) のをかいつまんで眺めていた。

https://www.amazon.co.jp/s?k=motor+fan+illustrated

クルマのメカには興味あるけど、パーツなどをカスタマイズして最高のチューンにしたいぜ、みたいなモチベーションは特になくて、自動車メーカーやサプライヤーがどういう原理のもと何を考えて自動車や部品を作っているのか、みたいな話のほうが興味あるんだなということがわかってきた。Motor Fan illustrated はそういう気持ちに応えてくれる雑誌だと感じる。

爆走することよりは、移動すること自体に喜びを感じているのかもしれない、という話をしていた。移動するだけで楽しい空間を移動することに喜びを感じる的な……。移動するだけで楽しい空間とは、首都高や風光明媚なスポットなど移動してなくても楽しい空間や、あるいは楽しい構造や線形を持つ道路というイメージ。そんでもって、屋根が開くクルマは移動の楽しさが非常に強化されるということも改めて感じていて、ダイハツコペンに行き着く (?) ことになる。

www.daihatsu.co.jp

で、般若ロボットなどと呼ばれる Robe の顔について思いを巡らせていた。まあ嫌ではないし、どっちかというと好き側な気がするんだけど釈然とはしないな〜と思っていたところにプジョーの最近のデザインが目に入ってきて、こういうことかと腑に落ちたということがあった。

プジョー 208 と COPEN Robe の顔の比較 (印象)
プジョー 208 と COPEN Robe の顔の比較 (印象)

プジョーの横のシュッとしたラインはライオンがカギ爪でシャっとやった痕がモチーフという設定らしいけど、コペンのそれがどうなのかはわからない。わからないけど、コペンの場合は爪痕の下端でフォグランプ周辺の樹脂パーツと造形が一体化しているという違いがあり、プジョーの顔と比べるといまいちシュッとした感じがしないのが引っかかっている気がする。

脈絡なさすぎだけど、プジョーのクルマを買うイメージは正直あまり無いんだけどなんとなく気になるので試乗くらいはしてみたいねっていうのが現状。実物見たことないけど 3D i-Cockpit も結構いいと思うのだよな……

www.youtube.com

*1:一般道・高速・首都高 合わせて数百キロは運転したと思う