Dockerを使ったD言語のワンライナービルド


はじめに

シェル芸はロマンです。
Dockerを使ってワンライナーで環境を汚さずにD言語のプロジェクトをビルドする方法を紹介します。

TL;DR

d-mansay で試します。

$ ls -1a
.
..
.dub
.git
.gitignore
README.md
dub.json
dub.selections.json
source
$ docker run --rm -v $PWD:/src -w /src dlanguage/dmd:latest dub -- ワンライナーだよ
Fetching east_asian_width 1.0.0 (getting selected version)...
Performing "debug" build using dmd for x86_64.
east_asian_width 1.0.0: building configuration "library"...
d-mansay ~master: building configuration "say"...
Linking...
Running ./d-mansay ワンライナーだよ
 __________________
< ワンライナーだよ >
 ------------------
    \    _   _
     \  (_) (_)
       /______ \
       \\(O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)
$ ls -1a
.
..
.dub
.git
.gitignore
README.md
d-mansay
dub.json
dub.selections.json
source
$ ./d-mansay Ubuntuだよ
 ____________
< Ubuntuだよ >
 ------------
    \    _   _
     \  (_) (_)
       /______ \
       \\(O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)

バイナリが出力されます。
ビルドに使ったコンテナと同じアーキテクチャであればそのまま実行できます。

注意点

  • 出力されるバイナリのパーミッションはコンテナのユーザーに依存します。
  • 依存関係がないプロジェクト前提です。dmanbotは以下のようにビルドできません。
$ docker run --rm -it -v `pwd`:/src -w /src dlanguage/dmd:latest dub build
Fetching dyaml 0.6.3 (getting selected version)...
Fetching tinyendian 0.1.2 (getting selected version)...
Fetching twitter4d 0.0.70 (getting selected version)...
Fetching mysql-d 0.3.3 (getting selected version)...
Fetching dunit 1.0.12 (getting selected version)...
Performing "debug" build using dmd for x86_64.
tinyendian 0.1.2: building configuration "library"...
dyaml 0.6.3: building configuration "library"...
mysql-d 0.3.3: building configuration "mysql-d"...
twitter4d 0.0.70: building configuration "library"...
dmanbot ~master: building configuration "application"...
Linking...
/usr/bin/ld: cannot find -lmysqlclient
/usr/bin/ld: cannot find -lcurl
collect2: error: ld returned 1 exit status
Error: linker exited with status 1
dmd failed with exit code 1.

おまけ

宗教上の理由等でGoをインストールしていない環境でも、go getを使ってバイナリを取得できます。

$ docker run --rm -v ~/bin:/go/bin golang:1.9.2-stretch go get github.com/adamryman/gophersay
$ gophersay
 ------------------------
Don't panic.
 ------------------------
   \
    \
     \   ,_---~~~~~----._
  _,,_,*^____      _____``*g*\"*,
 / __/ /'     ^.  /      \ ^@q   f
[  @f | @))    |  | @))   l  0 _/
 \`/   \~____ / __ \_____/    \
  |           _l__l_           I
  }          [______]           I
  ]            | | |            |
  ]             ~ ~             |
  |                            |
   |                           |