2016-03-14 10 views
6

DockerマシンでGolangアプリケーションを実行する必要があります。Golang Mac OSXのDockerマシン用のビルド

私はMac OSXで作業しています。DockerはLinux仮想マシンの上で動作していますので、MacでビルドされたバイナリはDockerで実行できません。

は、私がここに二つの方法を参照してください。

  1. クロスコンパイル
その上で「ビルドを行く」「取りに行く」を実行し、
  • コピープロジェクトソースがドッキングウィンドウへのLinux OS用のMac上でバイナリをし、

    最初はCGO(インポートされた一部のライブラリで使用されているため)のため難しいです。

    「go get」操作のため、秒が非常に遅くなります。

    あなたはその状況で最も一般的な方法は何ですか?または、私は何か間違っているのでしょうか?

  • +3

    Dockerは画像レイヤをキャッシュし、特定の画像から開始することができます。できるだけ多くのレイヤーを再利用できるようにDockerfileのコマンドを分割し、ソースの変更には独自のパッケージを作成する必要があります。 – JimB

    +0

    JimB、どうすれば 'go get'コマンドを分解できますか? RUN get package1/n RUNはpackage2 ...などを取得し、キャッシュされますか? –

    +4

    Donは 'go get'を使うか、少なくともそれを使ってベースイメージを作成してそこから開始します(' go get'は本番環境では使用しないでください)ので、ほとんどの人は依存関係を管理する方法があります。単一のDockerfileの基本的な解決策は、必要に応じてすべてのdepsをインストールするためのMakefileまたはスクリプトを作成することです。単一のRUN文に入れることができます。 – JimB

    答えて

    1

    ここでは、CGOを使用しても簡単にクロスコンパイルできるソリューションです。

    最近私はGo Appをビルドするために新しいWindowsビルドサーバーを取得するのに多くの時間を浪費してしまいました。 は今、私はちょうど私のMac上でそれをコンパイルし、それをLinuxのビルドサーバーを作成します。

    https://github.com/karalabe/xgo

    これは本当に素晴らしいパッケージピーターSzilágyiエイリアスkaralabeに感謝を!

    は使用方法:

    • がドッカーがgithub.com/karalabe/xgo取りに行く
    • を実行している
    • XGO --targets =窓/ AMD64 ./

    があります。さらに多くのオプション!

    0

    私は最初のアプローチを使用します。ここでは、gulpのタスクは、コードをビルドします。プロダクションフラグが設定されている場合はgo buildの代わりにGOOS=linux CGO_ENABLED=0 go buildが実行されます。バイナリがドッキングウィンドウコンテナ内

    gulp.task('server:build', function() { 
        var build; 
    
        let options = { 
         env: { 
          'PATH': process.env.PATH, 
          'GOPATH': process.env.GOPATH 
         } 
        } 
    
        if (argv.prod) { 
         options.env['GOOS'] = 'linux' 
         options.env['CGO_ENABLED'] = '0' 
         console.log("Compiling go binarie to run inside Docker container") 
        } 
    
        var output = argv.prod ? conf.paths.build + '/prod/bin' : conf.paths.build + '/dev/bin'; 
        build = child.spawnSync('go', ['build', '-o', output, "src/backend/main.go"], options); 
        if (build.stderr.length) { 
         var lines = build.stderr.toString() 
          .split('\n').filter(function(line) { 
           return line.length 
          }); 
         for (var l in lines) 
          util.log(util.colors.red(
           'Error (go install): ' + lines[l] 
          )); 
         notifier.notify({ 
          title: 'Error (go install)', 
          message: lines 
         }); 
        } 
        return build; 
    }); 
    
    0

    に動作しますので、あなたは、あなたの実行のために必要な個別のOSからドッカーコンテナを作成し、あなたのsrcディレクトリにボリュームをマップすることができます。コンテナを実行し、コンテナ内から実行可能ファイルを作成します。別のOSで実行できるバイナリになります。

    関連する問題