私は最初のアプローチを使用します。ここでは、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;
});
Dockerは画像レイヤをキャッシュし、特定の画像から開始することができます。できるだけ多くのレイヤーを再利用できるようにDockerfileのコマンドを分割し、ソースの変更には独自のパッケージを作成する必要があります。 – JimB
JimB、どうすれば 'go get'コマンドを分解できますか? RUN get package1/n RUNはpackage2 ...などを取得し、キャッシュされますか? –
Donは 'go get'を使うか、少なくともそれを使ってベースイメージを作成してそこから開始します(' go get'は本番環境では使用しないでください)ので、ほとんどの人は依存関係を管理する方法があります。単一のDockerfileの基本的な解決策は、必要に応じてすべてのdepsをインストールするためのMakefileまたはスクリプトを作成することです。単一のRUN文に入れることができます。 – JimB