Docker multi-stage builds

Docker 17.05から、新機能としてmulti-stage builds というものが導入されました。 これは、コンテナイメージをより最適化するために有用な機能で、Dockerfileからコンテナイメージをビルドする際にビルド依存のライブラリ/環境とランタイム依存のライブラリ/環境を切り分けることができる機能です。 具体例を見てみましょう。 Go言語で書かれた何らかのアプリケーションをコンテナ上で動かすことを考えます。 以前までであれば、以下のような二つのDockerfileを用いて作成します。 まずはビルド用Dockerfileです 1 2 3 4 FROM golang:1.7.3 WORKDIR /go/src/github.com/someone/foo/ COPY app.go . RUN GOOS=linux go build -a -o app . つぎに、実行用のDockerfileです。 1 2 3 4 FROM busybox:latest WORKDIR /root/ COPY app . CMD ["./app"] このようにすることで、ビルド時にはGo言語のビルド環境が入ったコンテナを、実行時は(Go言語環境は不要なので)busyboxコンテナを使用することで、実行イメージを小さく抑えることができます。 しかし、このように二つのDockerfileを使用する場合、コンテナイメージのビルド手順が煩雑になる、複数ファイルのため管理しにくいなどの問題がありました。 multi-stage buildsを実装されたことで、以下のようにDockerfileを一つにまとめることができます。 1 2 3 4 5 6 7 8 9 FROM golang:1.7.3 AS build WORKDIR /go/src/github.com/someone/foo/ COPY app.go . RUN GOOS=linux go build -a -o app . FROM busybox:latest WORKDIR /root/ COPY --from=build /go/src/github.com/someone/foo/app . CMD ["./app"] 一行目のAS build、九行目の--from=buildがポイントです。 ...

2017-08-17 · nasa9084

Go1.9rc1 is released!

Go1.9rc1がリリースされました! そこで、Go1.9のリリースノートをさらっと見てみようと思います。 (まだrc1なので、今後変更される場合があります。ご注意を) 全部見ていくと、結構な量になりそうなので、すぐに影響のありそうな部分だけ、軽く見ていきましょう。 type alias Go1.9ではType Aliasというものが導入されます。 これはその名の通り、型に別名をつけられるというもの。 言葉で説明するより、コードを見た方が早いと思いますので、コードを用意しました。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package main import ( "fmt" "log" ) type T1 struct { ID string Name string } type T2 = T1 func main() { t := T1{ ID: "id", Name: "Taro", } log.Println("call t1.Call()") fmt.Println(t.Call()) log.Println("call t2.Call2()") fmt.Println(t.Call2()) return 0 } func (t *T1) Call() string { return "hello, " + t.Name } func (t *T2) Call2() string { return "hi, " + t.ID } go1.8以前ではsyntax errorになるこのコードですが、go1.9では正常に動作し、以下のような出力をします。 ...

2017-07-26 · nasa9084

Riot.jsにSass(SCSS)を導入する

Riot.jsでは、標準でスタイルシートにLessを使用することができます。 その際の使用方法は簡単で、スタイルタグにtypeを指定するだけです。 1 2 3 <style type="less"> ... </style> 扨、ここで、イマドキな皆さんはLessじゃなくてSass(SCSS)を使いたい!と思うかもしれません(思いますよね?) なので、Sassを使えるようにしてみましょう。 基本方針 基本的には、riot.parser.css.sassにSassのコンパイラ関数を作成するだけです。 riot.parser.css.sassには、引数として、 タグ名 stylesheet が渡されます。この、第二引数をコンパイルして返す関数を作成すれば良いのです。 ランタイムコンパイルでSass(SCSS)を使用する ランタイムコンパイル時はsass.jsを使用します。 <head>タグ内で、https://cdn.rawgit.com/medialize/sass.js/v0.6.3/dist/sass.jsを読み込むなどすれば良いでしょう。 その上で、タグのマウント前に以下の記述を追加します。 1 2 3 4 riot.parsers.css.sass = function(tagName, stylesheet) { var result = Sass.compile(stylesheet); return result; }; gulp-riotプリコンパイルでSass(SCSS)を使用する glup-riotでプリコンパイルする際にSassを使用するには、node-sassを使用して、gulpfile.jsに以下のように記述します。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var gulp = require('gulp'); var riot = require('gulp-riot'); var sass = require('node-sass'); gulp.task('riot', function() { gulp .src('app.tag') .pipe(riot({ parsers: { css: { sass: function(tagName, stylesheet) { var result = sass.renderSync({ data: stylesheet }); return result.css.toString(); }, }, }, })) .pipe(gulp.dest('./')) ; });

2017-07-19 · nasa9084

Vagrantで起動したVMからBOXを作る

Vagrantで、centos/7等の標準的なBOXをベースにカスタムしたVMを保存しておいたり、配布したりするためにBOXを作る手順です。 自分用のメモとして。 VM内での操作 VBoxGuestAdditionsを導入する。 以下のソースを適当なファイルに保存する。(ここでは$HOME/ins.shとします。) このとき、二行目はVirtualboxのバージョンに合わせて適宜書き換える。 リストはこちら 1 2 3 4 5 6 7 8 yum install -y wget kernel kernel-devel perl gcc wget http://download.virtualbox.org/virtualbox/5.1.18/VBoxGuestAdditions_5.1.18.iso mkdir /media/VBoxGuestAdditions mount -o loop,ro VBoxGuestAdditions_5.1.18.iso /media/VBoxGuestAdditions sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run rm VBoxGuestAdditions_5.1.18.iso umount /media/VBoxGuestAdditions rmdir /media/VBoxGuestAdditions 保存したスクリプトを管理者権限で実行します。 1 sudo bash ins.sh yumをきれいにする 軽量化のため、yumをきれいにします。 1 sudo yum clean all ゼロ埋めして消す 圧縮効率向上のため、ゼロ埋めして消します。 1 2 sudo dd if=/dev/zero of=/EMPTY bs=1M sudo rm /EMPTY ホストからの操作 BOXを作成する 1 vagrant package ** box listに登録する ...

2017-07-11 · nasa9084

YAPC::Fukuoka 2017 HAKATAに行ってきました

今回は言われました!「ブログを書くまでがYAPC!」 と言うことで、YAPC::Kansai 2017 OSAKA (行ってきたときの記事はこちら )に引き続き、YAPC::Fukuoka 2017 HAKATA に行ってきました。 YAPCはPerlのイベントで、“Yet Another Perl Conference"の略です。twitterハッシュタグは前回に引き続き#yapcjapan でした。 福岡および九州は初めてでしたが、いや、暑いですね。 特にYAPCの翌日は非常に天気が良いものの、梅雨の湿気もあり、観光をしていて汗だくでした。 今回も大阪同様ホテルはとらず、適当にやっていくことに。 意外となんとかなるものです。 YAPC::Fukuoka 2017 HAKATA 今回も例に漏れず(?)寝坊でオープニングには間に合わず。 今回はPerl6の話は余り多くなかった印象です。 セキュリティの話、コンテナの話、テストの話など、非常に多様なセッションがありました。 今回のノベルティはなぜかモバイルバッテリーが二つも入っていたり、米が入っていたり、染み抜きペンが入っていたりととても面白い内容でした。 あ、いつものサイリュームも入ってましたよ。 個人スポンサーノベルティはビーチサンダル。これからの季節に良いですね。 LTをしてきました。 今回はLTもしてきました。 タイトルは「嗚呼素晴らしきemacs 」です。 ベストトーク賞 YAPCでは恒例のベストトーク賞ですが、今回は徳丸さんのゲストセッションがベストトーク賞に選ばれました。 しかしご多忙な徳丸さん。クロージングの時点ですでに帰還してしまってました。 仕方ないので徳丸さんの会社にお勤めの方が代理で受け取ることに。 なんと賞品を渡す人は徳丸さんのセッションを聞いていなかったようで・・・ ベストトークを聞いていなかった人が代理の人に賞品を渡すという、なんとも面白い事態でした。 ベストLT賞は@codehex さんで、YAPC::Okinawaの宣伝でした。 懇親会 懇親会ではPixivさんから抽選でプレゼントをいただきました。 Pawooのロゴ入りのモバイルバッテリー(これで今回三つ目)です。 次回のお話 次回YAPCは3月に沖縄で開催予定です。

2017-07-03 · nasa9084

Fujitsu FACOM128Bを見てきた

Open Source Summit Fujitsu Museum Tour )で、富士通 沼津工場まで行って、現在動作する世界最古のコンピュータであるリレーコンピュータ「FACOM128B」を見てきました。 Fujitsu FACOM128B は1958年に作られたリレー式自動計算機で、富士通沼津工場に置かれているものは1959年製です。Fujitsu Webサイト から申し込みをすることで、中学生以上なら見学することができます。 圧巻です。エンジニアなら一度は見ておくと、感動ものです。

2017-06-06 · nasa9084

emacs-macでtwittering-modeを使った際に毎回PINを聞かれる問題の解消

twitterのクライアントとして、日頃からemacs上で動くクライアントの"twittering-mode"を使用しています。 ところが最近、新しいmacにインストールしたemacs-macでtwittering-modeを起動すると、毎回twitterのPINを聞かれるようになってしまいました。 毎回、毎回、起動時の暗号化フェーズで Encrypt failed Exit と言われ・・・・ 以前使っていたmacではこのようなことが無かったため、困っていたのですが、以下の手順により解決できました。 背景 結論から言うと、これはGnuPGのバージョンが新しくなったことによる問題でした。 GnuPG2.1.0から、gpg-agentとpinentryと呼ばれる二つのソフトウェアの利用が必須となりました。 twittering-mode事態はgpg-agentやpinentryが必須でも基本的に問題なく動作するようにはなっているハズ・・・でした。 しかし、これらのソフトウェアの必須化に伴って、これまで標準入力から入力できていたパスフレーズが標準入力から入力できなくなっており、そのために暗号化に失敗して毎回PINを聞く・・・という状態になっていたようです。 解決策 みんな大好きarch wiki に解決策がありました。 まず、~/.gnupg/gpg-agent.confに以下のように記述します。 allow-loopback-pinentry つぎに、~/.gnupg/gpg.confに以下のように記述します。 pinentry-mode loopback 最後に、gpg-agentを再起動します。 コマンドラインから、 1 $ gpgconf --kill gpg-agent でgpg-agentを再起動できます。 以上で、twittering-modeが正常に使用できるようになるはずです。

2017-05-09 · nasa9084

MySQL on docker macな開発環境でローカルからMySQLに接続する

MySQLをdocker上に立てることで、ローカルの環境を汚さずにMySQLを使ったアプリケーションの開発を行うことができます。 特に、練習段階や、動作確認などの場合、 test_hogehoge な感じのデータベースやテーブルを作ってしまい、後片付けをしないために汚くなっていく、なんてこと、あるんじゃないでしょうか。 さて、MySQL on dockerへの接続、今までローカルにMySQLを入れて開発していたのでちょっと躓きました。 1 $ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD password mysql:latest 上記のように起動した場合、次のようにコマンドを実行することで接続することができます。 1 $ mysql -u hoge -p -h 127.0.0.1 --port 3306 特にポイントなのが、-h 127.0.0.1の部分。localhostにしてしまうと、socketで接続しようとして、エラーになっちゃうんですね。 ここでしばらく悩みました。。。 以上、簡単ですがメモがてら。

2017-05-02 · nasa9084

golang: net/httpでBASIC認証

golangでベーシック認証するのはどうしたら良いのかなー。って思ってたら、net/httpでhandlerに渡されるhttp.RequestにBasicAuth()というメソッドが生えてました。 これはBASIC認証用のユーザ名、パスワード、ヘッダ解析のフラグという値を返してくれます。 なので、 1 2 3 4 5 6 7 8 9 func handler(w http.ResponseWriter, r *http.Request) { username, password, ok := r.BasicAuth() if !ok { return } if username == "hogehogeuser" && password == "fugafugapasswd" { // something } } とすることで認証することができます。簡単、簡単。 なお残念ながらダイジェスト認証はサポートされていない様子。

2017-05-02 · nasa9084

YAPC::Kansai 2017 OSAKAに行ってきました

12月のYAPC::Hokkaido 2016 SAPPORO (行ってきた時の記事はこちら )に引き続き、YAPC::Kansai 2017 OSAKA に行ってきました。 今回もブログを書くまでがYAPCとは言われなかった気がします。 YAPCはPerlのイベントで、“Yet Another Perl Conference"の略です。twitterハッシュタグは前回に引き続き#yapcjapan でした。 私にとって、大阪はもちろん、関西自体が初めてで、かなり余裕のあるスケジュールを組んだために、どう時間を過ごしていいか悩むといった自体に。 空港に降り立ち、まずどうしよう、という状態ですね。困った。 仕方がないので大阪出身の友人に、「大阪観光ってどこいったらいいのかな」と聞いてみたのですが、「まぁたこ焼き食べたりしたら?」と今ひとつ役に立たない返事。まぁ食べますけど! それでも心斎橋とか難波に向かうとよいと教えてもらえたので、Googleマップ先生に頼りつつ、難波へ向かいました。 結果、何をしたかというと、札幌からの移動前に新しく購入したスマホ用のあれこれをビックカメラで購入するという、大阪まできて何をやっているのかというなんとも残念な行動となってしまいました。 ホテル探し 今回、北海道から関西まで、勿論飛行機で移動したわけですが、実はホテルも取らずに(!)、YAPC以外は無計画での旅行でした。 とりあえずYAPC前日くらいはホテルに泊まらねば朝起きれない!ということで、ホテル探しをしました。 運良く会場(MOTEX ホール )の近くに割と安く宿を取ることができました。 こちらがそのお部屋の写真。シングルの部屋を5,500円(500ポイント適用後)でとったのですが、入ってみてびっくり、ツインの部屋でした。 安かったものの、なんとなく豪勢な感じ。 夜ご飯は近くのお店でたこ焼きを食べました。 十八番というお店で、後で調べたら結構有名っぽいですね。美味しかった。 たこ焼きを塩で食べるというのは初体験でしたが、これもなかなかです。 YAPC::Kansai 2017 OSAKA 開けて翌日。微妙に寝坊したおかげでオープニングには間に合いませんでした。 一番印象に残ったトークは「Vue.jsで作るSPAから学ぶMVVM、非同期処理、その光と影」ですね。 タイトルにVue.jsと入っているにもかかわらず、Vue.jsという言葉が出て来たのは一度きり、SPAの話のはずなのに、「SPAはやめよう」と、なんだかタイトルに釣られた感が半端ない内容でした。 勿論内容も素晴らしく、「ブラウザはドキュメントビューアなんだからリッチなインターフェースを作るものではない」「ブラウザでリッチなインターフェースを作るのはなんでもVimでなんとかしようとするようなもの」「とはいっても作らなきゃいけない時もある」という、SPAはやるべきじゃないけど、現状やらなきゃいけないことはどうすれば良いのか、その時MV*はどのように構成したらいいのかといった、きちんと筋が通っていて、とても面白い話でした。 次に印象に残っているのが、「Webアプリケーションのキャッシュ戦略とそのパターン」です。 こちらも「キャッシュは使わないほうがいい」という、タイトル詐欺みたいな話でしたが、非常に納得のいく内容でした。 ベストトーク賞の投票で票を入れたのは「Webエンジニアに知ってほしいRDBアンチパターン」です。 内容もさることながら、やはり喋りが素晴らしいんです。とっても練習をしていると聞いています。 ランチタイムはスポンサー企業の方と昼食をいただきました。 今回交通費支援をいただいたので、その対価のようなものです。 実際には、企業に関わるお話は結局あまりしなかったのですが、会場の近くはあまり飲食店がない印象で、昼食を取るのも大変そうでしたので、大変助かりました。 YAPC::Kansai 2017 OSAKAのステッカーはこんな感じ。 札幌の時のものと並べてはるには、上下を揃えるのが難しい形状で、ちょっと難儀します。 次回のお話 次回YAPCは福岡で開催だそうです。YAPC::Fukuoka 2017 HAKATA すでにチケットも発売されています。 その後は沖縄、東京が企画されているそうです。 是非回りたい。

2017-03-05 · nasa9084