きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

Creating RHEL7.3 Vagrant Box using Packer and VitualBox on Windows10

準備するもの。
  1. VirtualBox + Extension Pack
  2. Packer
  3. Vagrant
  4. RHEL

あと、ハッシュ計算できるコマンドも必要かな。
自分の場合はpowershell立ち上げたらmd5sumなどが見つかったけど。
とりあえず、RHEL以外をインストールしてくださいな。

RHELの話

Red Hat Developer Programに参加して、
(登録は必要だけど)無償でRHELを手にいれます。
あくまで個人用で、VirtualBox上で動かします。
VirtualBoxで動かす例は、Red Hatのページでも手順が公開されていますが、
手でペチペチインストールするのが面倒臭くなるので徐々に自動化します。

はじめは手でインストール

anaconda-ks.cfgが欲しいじゃないですか。
それを手直しして、とりあえずこういう感じのにしました。
firewallを書き忘れてたり、ツッコミどころはたくさん。
ミニマムインストールなのに、レポジトリの追加もしてます。
いつか使うかもしれんから勉強のために追加してるだけです。

auth --enableshadow --passalgo=sha512
repo --name="Server-HighAvailability" --baseurl=file:///run/install/repo/addons/HighAvailability
repo --name="Server-ResilientStorage" --baseurl=file:///run/install/repo/addons/ResilientStorage
text
cdrom
firstboot --enable
ignoredisk --only-use=sda
keyboard --vckeymap=jp --xlayouts='jp'
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8
network --bootproto=dhcp --device=enp0s3 --onboot=true --ipv6=auto
network --hostname=localhost.localdomain
rootpw --iscrypted $6$VzSTNp8xLdgMSJNe$Ns6mWbts4wIV9NRt.mZhDaQZLSKuzfEwZ.gXDw3hmVTJtkYbERPhB3jil.OghoOc6yEBtQe6tz9ovbMVvB18E/
services --disabled="chronyd"
timezone Asia/Tokyo --isUtc --nontp
user --name=vagrant --password=$6$hyGjqRR76Cf5KOF9$gwz6bfU8HvYB.15VjAIdKWB8jJAAJ8rlS9kuv6gWfAZNvN9JkmCCJDepiFM4eYNexD2E0.CRjXoEJwOloJUVF. --iscrypted --gecos="vagrant"
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
clearpart --none --initlabel
eula --agreed
reboot

%packages
@^minimal
@core
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end

%post

%end

ネットワークはonboot付けてないと面倒です。
付け忘れた場合はあとでks.cfgのfetchに失敗しますよ。
ユーザとパスワードは以下のとおりです。
root/vagrant
vagrant/vagrant
まあ、Vagrant用のBoxを作る前提ですからね。
日本語うざいんで、langをen_US.UTF-8をメインにしてます。

Packerのファイルを作る

ks.cfgを使う設定ファイル(rhel73.json)を書いた。

{
  "description": "creating rhel 7.3 vagrant box",
  "builders": [
	{
	  "type": "virtualbox-iso",
	  "vm_name": "packer-rhel73",
	  "guest_os_type": "RedHat_64",
	  "iso_url": "file:///C:/Users/{{user `username`}}/Downloads/rhel-server-7.3-x86_64-dvd.iso",
	  "iso_checksum": "34a65dbdfb8d9bb19b3a03d278df2a99",
	  "iso_checksum_type": "md5",
	  "ssh_username": "root",
	  "ssh_password": "vagrant",
	  "shutdown_command": "echo 'packer' | sudo -S shutdown -P now",
	  "http_directory": ".",
      "vboxmanage":[
		["modifyvm", "packer-rhel73", "--memory", "2048"],
		["modifyvm", "packer-rhel73", "--cpus", "2"]
	  ],
	  "boot_command": [
		"<esc><wait>",
         "linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg ksdevice=enp0s3<enter>",
		 "<wait>"
      ]
	  
	}
  ],
  "provisioners":[
	{
		"type": "shell",
		"inline": [
			"cat <<__EOF > /etc/sudoers.d/vagrant",
			"vagrant ALL=(ALL) NOPASSWD:ALL",
			"__EOF",
			"chmod 440 /etc/sudoers.d/vagrant"
		]
	},
	{
		"type": "shell",
		"inline": [
			"mkdir -p /home/vagrant/.ssh",
			"chmod 700 /home/vagrant/.ssh",
			"chown vagrant:vagrant /home/vagrant/.ssh",
			"cat <<__EOF > /home/vagrant/.ssh/authorized_keys",
			"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key",
			"__EOF",
			"chmod 600 /home/vagrant/.ssh/authorized_keys",
			"chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys"
		]
	},
	{
		"type": "shell",
		"inline": [
		    "mkdir -p /media/cdrom",
			"mount /dev/cdrom /media/cdrom",
			"cat <<__EOF > /etc/yum.repos.d/rhel-dvd.repo",
			"[rhel-dvd]",
			"name=Red Hat Enterprise Linux 7.3 - x86_64 - DVD",
			"baseurl=file:///media/cdrom/",
			"enabled=0",
			"gpgcheck=1",
			"gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release",
			"__EOF",
			"yum -y --enablerepo=rhel-dvd install bzip2 gcc make kernel-devel",
			"yum -y --enablerepo=rhel-dvd groupinstall \"X Window System\"",
			"mkdir -p ~/guestaddition",
			"mount -t iso9660 -o loop ~/VBoxGuestAdditions.iso ~/guestaddition",
			"~/guestaddition/VBoxLinuxAdditions.run",
			"umount ~/guestaddition",
			"rm -rf ~/guestaddition ~/VBoxGuestAdditions.iso"
		]
	},
	{
		"type": "shell",
		"inline": [
			"yum -y --enablerepo=rhel-dvd install unzip lsof psmisc",
			"umount /media/cdrom",
			"eject -r /dev/cdrom"
		]
	}
  ],
  "post-processors": [
	{
	  "type": "vagrant",
	  "compression_level": 1
	}
  ]
}

vm名なんかは変えてください。
これは手インストール時に使った名前と被らないようにしただけです。
yum.repos.dへの追加には、addonの類が入ってませんが、好みで追加してくださいな。
ksdeviceを書くのは過去の経験からです。
奇妙なヒアドキュメントの書き方がありますが、これで動きます。
あの配列は改行コード付きで連結されるという仕様があるためです。

簡単に言うとpackerは自前サーバを立てて、http_directoryにあるks.cfgを公開します。
bootコマンドを受け付けた側は、ネットワーク経由でそのks.cfgを見に行きます。
そのため、このときにハマるのはたいていネットワーク系の問題です。

あと、今回メモリは2GBしか割り当ててないですが、RHELは4GB(推奨8GB)です。
おそらくそのあたりが原因でkdumpサービスが起動できてないように思います。

いざビルド
 packer build -var "username=myname" rhel73.json

packerがbootコマンドをチンタラ書いてる様子、いとおかし。
自分の記憶では、その部分はgo-vncで投げていたはずです。


あとは、vagrant box addとかしてください。

細かいことは抜きにすれば、おもちゃにできるRHELを手に入れられたので、
RHELのコアダンプを読む方法について勉強してみようかな。


追記:
反省。
いざ起動してみると光学ドライブがないという話・・・。
vboxmessageに何か加えればいけるやろ。

jmockitのDeencapsulationでstatic finalを書き換えできるの?それは使ってるバージョンによる!

今、迷っている。
書き換えられるっぽい過去の経験、書き換えられない最近の経験が混ざっている。


よし、確かめよう。
ダラダラ書く。

Deencapsulationのコードをgithubで読んだ。(もちろんコール先も読んだ)
https://github.com/jmockit/jmockit1/blob/master/main/src/mockit/Deencapsulation.java
static finalを書き換える特殊なコードは書かれていないようだった。
実際に、自宅の環境では書き換えに失敗している。


自分は、こういうことを予想していた。
modifiersの書き換えをしているんじゃないだろうか。
一旦finalを外して書き込むとか。
ところがそういうのをやっていないようだった。
過去の経験はまやかしか?


実際に、modifiers書き換えによるstatic finalフィールドへの書き込み例はネットでも見受けられる。
final修飾子を除去するコードを書いて試している。
だけども、この方法は完璧ではないと感じたことがあるので書いてみる。

①そもそも正攻法ではない。
Fieldオブジェクトのmodifiersのフィールド名称は実装に依存するから、正式な方法とはいえない。
誰でもそう感じるだろう。

②書き換えた内容が残らない(Fieldオブジェクトのmodifiersの話)
Fieldオブジェクトのmodifiersを変更したとしても、
ClassオブジェクトからgetDeclaredFieldし直すと、
そのmodifiersは本来の値に戻っている。
これはFieldオブジェクトが別物なんだから多少納得がいくだろう。
ちなみにFieldクラスのequalsメソッドはmodifiersを評価していないようだ。

③modifiersの一貫性が損なわれる(FieldオブジェクトのoverrideFieldAccessorの話)
次の例ではまた別のことを考える必要がある。
getDeclaredFieldを叩いたのちに、setAcessible(true)して、setに失敗しているコードがまず存在していて、
その後、取り直した別のFieldオブジェクトに対してmodifiers書き換え版のコードでsetを試みるとしよう。
この場合、書き換えは失敗する。

これの怖くて面白いところは、Fieldオブジェクトそのものが返すmodifiersと、
内部のaccessorが持つmodifiers関連変数の一貫性がなくなることだ。

逆にmodifierを書き換えるコードを先に成功させてしまえば、accessorは書き換え可能な状態で残る。
accessorについては、2度目のgetDeclareFieldでも同じインスタンスが設定されているようだ。

ここで言っているaccessorというのはsun.reflect.UnsafeFieldAccessorImpl系の話をしている。
内部で型に応じたUnsafeFieldAccessorImplのサブクラスが作られている。
setするときは、overrideFieldAccessorフィールドに置かれるっぽい。
final付きのFieldの場合とそうではない場合で、setされるaccessorは異なる。
isFinal変数を持つクラスと、isReadOnlyを持つクラスがいて、
isReadOnlyをfalseに書き換えるとfinal修飾子が付いたまま書き換えることができるようになる。

  1. isFinal : abstract class sun.reflect.UnsafeFieldAccessorImpl extends sun.reflect.FieldAccessorImpl
  2. abstract class sun.reflect.UnsafeStaticFieldAccessorImpl extends sun.reflect.UnsafeFieldAccessorImpl
  3. isReadOnly : abstract class sun.reflect.UnsafeQualifiedStaticFieldAccessorImpl extends sun.reflect.UnsafeStaticFieldAccessorImpl
  4. : class sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl extends sun.reflect.UnsafeQualifiedStaticFieldAccessorImpl

ちなみに、先にmodifiersを書き換えてfinalがついてない場合は、
isReadOnlyを持つクラスは使われていないようだ。(Qualifiedが付かないクラスが使われている)




うーん、Javaの実装に依存するなら、成功したのは非OracleJavaだったからかな。
OpenJDK7の実装もOracleと同じっぽい。
自宅の環境はOracleJavaのjdk1.8.0_121(最新)にあげて試した。
IBMJavaでも試したいのでWASDを用意した。8.5.5.11。
fixpack11から標準でJava8っぽいな。
IBM Java8およびJava7で試したがやっぱりできないよ。
やっぱり過去の経験はまやかしか?



ここからgradleでテストするように変更を加えた。(build.gradleを用意した)
すると、どうだろう、テストが成功し始めるではないか。
はぁぁぁぁぁぁあ!?
落ち着けオレ。
ちゃんと調べた。
凡ミス、modifierの書き換えが一番初めに動いたせいだ。


ふむ、一般的な解決策は、static finalのインスタンスを置き換えるのではなく、
static finalのインスタンスをDeencapsulationでgetして、それをMockUp(インスタンス)して期待する動作を書くとかだ。
インスタンスを引数に渡すとmockitoのspy相当になる。

jmockitのMockUpの場合、インスタンスを書き換えてるからクラスも同じ、setし直しは不要。
mockitoでspyした場合、別クラスの別インスタンスができてるのでsetし直しが必要で、static finalにsetできず困る。


static finalを書き換える方法については、他にsun.misc.Unsafeを使う方法がネットで調べられる。
まあ確かに一番強力な方法であるが、これも正攻法ではない。説明しないでおく。
正攻法でstatic finalを書き換える方法はない。


まやかしがまだ信じられないので追加調査。
やっぱりまやかしではなかったぞ。
jmockitの古いバージョンではmodifiersを書き換えとるやないか。
Dropped the support for setting static final fields through the Deenc… · jmockit/jmockit1@3819065 · GitHub
えっと、どのバージョンまで書き換え可能なんだ・・・。
1.24まで書き換え可能、1.25から書き換えできない。
1.25は2016年6月26日リリース。issues#281でdropしている。

jmockitのバージョンをあげるときの悲鳴は不可避や。

インフルエンザではなく風邪の模様

職場でインフルエンザA型感染者が2名出現。

 

火曜日の昼に、自分も不思議な熱を感じはじめたため、水曜日の午前中に内科に行ってきた。

結論は陰性で問題ない。

 

ここから先は、ふだん行かない場所(内科、処方箋受付)に行ったので、気になったことについて書く。日頃から気付いたことについて考え、なぜそう考えるのかと根源を求める性格。

 

社会人になって内科に行った記憶がない。

風邪を引いても市販の薬と大量の飯で治すタイプだ。

待ち合いはご老人が多い。

ああ、そうか、子供は小児科に行くもんな。

トイレの場所がカーテンの奥とあるが、不思議なところに誘導するんだな。

内科で言われたことで疑問に思ったこと。

インフルは初日から症状がでる。

むむむ、そんな話は聞いたことがない。

潜伏期間とかあるじゃん。

しかも、職場で流行しているのが、インフルエンザのA型なのか、B型なのかを聞いてこなかった。潜伏期間に差があるだろう。。。

医者が操作してソフトが気になった、UIが。。。聖路加病院とかはもっと綺麗なUIだったが、町のお医者さんでは無理からぬこと。

インフルエンザの検査は、鼻の穴の奥から検体を採取する。怖い。差し込まれるものが硬いのか柔らかいのか不安になった。

小さいころ耳鼻咽喉科でしょっちゅう鼻に金属製の器具を差し込まれていたので耐性がある。

 

念のため風邪薬の処方箋を受け取る。

処方箋も久しく受け取ったことがないな。

 

くすりの福太郎に向かう。

40分待ちだそうだ。

長いね。待ち行列を計算するか考えたが、今回は計算しないことにした。

ジェネリックに変更しますかという質問をされた気がする。

はあ、知るかボケ。そう思った。

日本語を話せ。何を言ってるのか分からない。

「同じ効能で低価格なお薬がございますが〜」くらいを言えるようになったほうがいい。

変更するメリット・デメリットが伝わるようにしてくれ。

また、たとえ効能が同じだとしても、医者が処方した薬以外に変更してよい法的な根拠とはどこにあるのか気になった。

 

初来店のため問診票のようなものを書く。

個人情報保護法の記載は、待ち合い室に貼ってあるとか書いてあるのだが、私の視力ではどこに貼ってあるのか確認できなかった。

ふぅ、一字一句の事実確認をしていくのは職業病だ。。。

 

 

待ち行列における女性比率の高さに驚いた。

今回はたまたまなのか。

文句をいう女性がいた。

日本には心のゆとりが足らないんじゃないか。

諸般の事情で順番が前後することがある。

小さな電光掲示板には32番まで呼びましたとある。

あれよあれよという間に私の41番まできた。

32番と思しき女性が立ち上がり文句を言いにカウンターに迫っている。

人がイライラしているのを見ると気分が悪くなる。

あと、女性比率の高さを見て、医療費の男女内訳とか統計があったりしないのかなと思った。

 

薬を配達にきた人が2回はいた。

受け渡しの確認作業をしている。

なんか、受け渡しもそうだけど、効率化できる要素はたくさんありそうだ。

カプセルとかの調合がいらない薬ならロボット任せになる時代はくるかもしれない。

 

 

待ち合いに置いてある雑誌は、なんで美容院に置いてるような雑誌なのか気になった。

男は迷わずMONOマガジンだと。

 

椅子の後ろに張り紙でQRコードがあったので、お薬手帳のアプリをダウンロードしてみた。

これのUIはとてつもなくダサい。

利用者は誰だ。比較的不健康な人だ。

年に1回くらいしか医者にかからない人には必要ないだろ。

基本、老人相手だ。

ただ、スマホを使える老人に限られる。

まず、文字は大きくあるべきだろうし、

ボタンも大きめの方がいい。

画面遷移のたびに画面下部が右からスライドしてくるのがウザい。

職場で私はスマホアプリを作ってないので、こんなところで市場調査しても意味ないのにな。

 

 

 

 

世界最高峰の頭脳集団 NASAに学ぶ決断技法

世界最高峰の頭脳集団NASAに学ぶ決断技法―不可能の壁を破る思考の力

この本を読了した。

 

寸評する。

 

私が感じている問題意識に対して、

相当量の光明を与えてくれた。

その意味で良著と言える。

 

だが、読みにくい。非常に読みにくい。

文章がかなり説明的だ。

図表はそこまで悪くないんだけど、それを頑張って文章で説明している部分が野暮ったい。

「虞(おそれ)」という読みにくい漢字を多用するのはまず変えたほうがいいだろう。

 

 

この本には、大事なことが書いてあると感じているが、これを実践するのはなかなか大変そうだという予感もある。

ただ、より良い意思決定をするために、この本に書いてある内容は見逃せない。

 

 

合理的意思決定、それをここ数年考えている。

情報がデータとして揃うことは少ない。

そんな中で意思決定をする必要がある。

そしてだいたい決断をあまり先伸ばせない。

不確実な部分をどうするべきか。

自分は意思決定をする人間ではないが、意思決定を求める人間ではありえる。

そうなったときに、どのように意思決定を求めることがより合理的な意思決定に繋がるかを悩んでいる。

 

とりあえず、この本から使えそうなエッセンスを抜き出して試していってみよう。

 

 

2016年 大道芸ワールドカップ in 静岡 初日

東京駅からひかりで1時間。

静岡に行きました。

大道芸ワールドカップのリピーターです。

自宅から脚立持参。

 

 

寸評をば。

 

コミックトリオ エクイヴォキー

非常に優秀。正統派コメディ。笑かしてくれます。こういうのを一本必ず見ておきたい。

 

 

ラソテッラ

何かの間違いか。本来男性含む3人なのに、女性2人しかいませんでした。技のバリエーションが減ってしまい、リピーターとしては満足できませんでした。過去に見た自転車モノではトップランクの芸を持ってます。

 

 

うつしおみ

日本人のエアリアルとはアラ珍しい。

エアリアルの技術が非常に高かったと思う。今後の活躍が期待されます。

 

 

イズマ

キレイ、カワイイ。AKBとかにいそう。

しかし和風マジックのはずなのにコンタクトジャグリングから入ってきたのが不満。

全体的にどこで拍手をすべきか悩む。

あと、道具が小さい。それは良くない。

ここで拍手、みたいに、客に拍手をしてもらう時間を与えてほしい。

この世界観の出し方は、屋外では不向きではないだろうか、コンクール向きに思える。

着物脱いだら華奢でした。

 

 

ジェフ ヘス

少し下品な笑いかな。あんまり好きになれなかった。笑える悪ふざけみたいな感じ。

 

 

カナ∞

とにかく元気、客の煽り方に慣れている。フープ芸に磨きがかかってる。見て損はない、いや見た方がいいと推薦していいレベル。

メイン広場で演技できるまでに成長したな。

なんかスイスで賞を取ってきたとか解説されてた。

もうほとんど完成形なんだけど、このあとどうするんだろね。

 

 

クロキキィブラザーズ

大道芸の中では演目が異色。レベル高く、ちゃんと笑わしてくれるし、スゴイと感じさせてくれる。しかし、持ちネタのオチ、途中で気付けたよ、その演目のオチのパターンは少ないから予想できる。でも世界各国で活動できると感じさせられた。

ここ数年、韓国のパフォーマーに感心させられる機会が増えてきた。

 

 

と、ここまで見たあとで、25周年記念特別企画 ザッツ 笑 タイムのチケットを購入。

当日券、初日は840枚も販売されてましたよ。

個人の結論を先に書いておくけど、買うほどの価値はなかったかな。普通のプレミアムのほうは完売してて、そっちのほうが見る価値があると思う。

 

 

開演の一時間前、開場の30分前くらいから並ぶといい。

夜は寒い。ほんとに寒い。寒さ対策をしましょう。野球のナイターを見るのとさほど変わらない寒さです。

ざっくりと500人くらいが来場していたんではないだろうか。

 

 

重複したパフォーマーを除いて寸評。

 

 

イェンタウンフールズ

古典だね。ほとんど古典だね。物足りなかったよ。でも小さい子供にはウケると思うんだ。

すごい長いやつは良かった。

 

 

フレイザー フーパ

客いじりの天才だ。

客が天才だ。

 

 

エル グラン ディミトリ

スベりまくってた。

日本人向きではない気がする。

 

 

ル ヴレ マジョー

んー、ディミトリほどではないが、評価は低い。

 

 

ハイドラゴン

昨年のチャンピオン。

エアリアルなんだけど、手放し多め、妙にゆったり。地味に難しいことをやってるような印象を受けた。他のエアリアルの人はけっこうスピード感歩く技も入れてるんだ。

変な角度で考えると、エアリアルより、おじいちゃんのアコーディオンが実はスゴイのかも。

 

 

エアリアルの技で目を惹くものの一つにこういうのがあります。上から下へ向かって歩くやつです。体は水平、足で布もしくは紐の上を歩くやつ。体重を手では支えてません、体に巻きつけた部分で支えて、歩く歩幅で緩めて、下に降りてくるんです。

 

明日もちょっとだけ見てきます。

 

カープ敗戦前後の読書録

週末に読んだ本。

 

世界のトップを10秒で納得させる資料の法則

 

これはソフトバンク孫正義氏の社長室長をしていた人が書いた本です。

読んでみた感想としては、「オススメしません」。

いくつかは評価できると思えますが、これが私の感じていることを解決できるかという点で、解決できないと感じた為です。

終盤、エクセルやパワポのテクニックの話になったところで飽きてきました。

うーん、営業職の人には良いのかもしれませんね。

 

 

実家からの帰りの新幹線でもう一冊読みました。

図解 頭のいい説明「すぐできる」コツ: 今日、結果が出る! (単行本)

 

内容はさきほどの本と重複する部分があります。

すごく単純明快なことが書いています。

特に、この本で伝えたいことが青字で強調されて頭に入ってきます。

読むのに2時間かからないかも。

文字も大きくて、文章が少ない、そのうえ論旨が明快。

軽く読むならこちらの本が良いでしょう。

 

いずれの本においても共感できる部分がある。自分が資料を書くときにまずぶち当たるのは、「伝えたい」は何か、「効果的に伝える方法」は何かなんてことで、どちらもそういう話は取り上げてます。

 

 

自分の書く資料は、文章が少ない。

下手したら文章がない。

心のどころで「オレは俳人になる!」とか思っている。

575のように、コーヒーをドリップするように、無駄を削ぎ落としたいと考えている。

困ったことに、せっかく削ぎ落としたのに、これを入れろ、あれを入れろと言われる場面があることだ。メッセージがブレる。まじで困る。

入れないと次のステップに進ませてくれない。

proxy環境下のhyperlegder/fabricの勘所

とにかく面倒くさい。

日本人であるビハインドの次に、プロキシ通さないといけないビハインド。

 

1つ目

Windows上のvagrantプログラムが最新のboxを探すためのproxy設定。

これはコマンドプロンプトからvagrant upを呼ぶ前提として、Windowsが認識するhttp_proxyやhttps_proxyを環境変数としてsetする。

これ自体はファイルの修正は不要。

 

2つ目

vagrant upした時に、virtual box上の仮想マシン(ubuntu)がapt-getするので、そこにプロキシを通してあげるために、(自分のやり方では)vagrant-proxyが導入されている前提で、VagrantFileにそれ用の記述をしておく。まあ、ファイルを書き換えなくても、プラグインが認識する環境変数を渡す手もある。

あと、後々に変にdockerコンテナ間の通信でプロキシを挟まないようにNO_PROXYも書いておいたほうがいい。

 

3つ目

プロビジョニング中に呼ばれるsetup.shで/etc/default/dockerを上書き(>)しやがるせいでハマるため、setup.shを修正して、/etc/default/dockerに、プロキシ設定をexportする記述を追記(>>)する。

上書きしやがるというのは、vagrant-proxyにおけるdocker用設定は意味ねーって状態になる区間があるという話です。

 

4つ目

仮想マシン上でプロビジョニング中にdocker buildする際に、apt-getがまた動くのだけれど、それに対応するために、docker.shにONBUILD時の環境変数(ENV)としてプロキシ設定を書き加える。

docker.shからdocker build時に呼び出されるcommon.shに書き加える方法もあるが、docker.shで作ってるDockerFileに対して設定を与えるほうがスマートであろうと考えている。

うーむ、/etc/apt配下ファイルをコピー(COPY)する?というやり方もあるのかもしれんが、いまはONBUILD ENVで環境変数を切っている。

 

まとめ

インターネットに繋ぎたがる3つの主体。

Windows上のvagrantプログラム

仮想マシン上でのapt-get

仮想マシン上でdocker build時のapt-get

 

vagrant-proxyを導入しただけでは動かないから覚悟しときやー。