2016-03-14 35 views
6

Potrzebuję uruchomić aplikację Golang na maszynie Docker.Golang Mac OSX kompilacja dla maszyny Docker

Pracuję na Mac OSX, a Docker pracuje nad maszyną wirtualną Linuksa, więc pliki binarne zbudowane na Macach nie działają na Dockerze.

Widzę dwa sposoby tutaj:

  1. cross-kompilacji binaria na Mac dla systemu Linux OS
  2. źródła projektu kopia do Docker uruchom 'idź' i 'iść build' na nim

Pierwsza jest trudna z powodu CGO (jest używana w niektórych bibliotekach importowanych).

Drugi jest bardzo wolny ze względu na operację "idź".

Czy możesz mi powiedzieć, która droga jest najczęstsza w tej sytuacji? A może robię coś nie tak?

+3

Docker buforuje warstwy obrazu i umożliwia rozpoczęcie od określonego obrazu. Rozdziel komendy w pliku Dockerfile, aby móc ponownie użyć jak największej liczby warstw, a zmiany w źródle wymagają tylko utworzenia własnego pakietu. – JimB

+0

JimB, ale jak mogę zepsuć komendę "idź"? RUN go get pakiet1/n RUN go get pakiet2 ... itd. I będą one buforowane? –

+4

Don 'use 'go get', lub przynajmniej utwórz z niego podstawowy obraz i zacznij od tego (' go get' nie powinno być używane w produkcji, więc większość ludzi ma inną metodę zarządzania zależnościami). Podstawowym rozwiązaniem w jednym pliku Dockerfile jest utworzenie pliku Makefile lub skryptu do zainstalowania wszystkich depów zgodnie z wymaganiami, które można umieścić w pojedynczej instrukcji RUN. – JimB

Odpowiedz

1

Oto rozwiązanie, które umożliwia super-krzyżową kompilację nawet z CGO.

Natknąłem się na to niedawno, po tym, jak traciłem dużo czasu na uzyskanie nowego serwera budowania systemu Windows w celu zbudowania aplikacji Go. Teraz po prostu skompilować go na moim Macu i stworzyć serwer Linux budować z nim:

https://github.com/karalabe/xgo

Dziękujemy Piotrowi Szilágyi alias karalabe do tego naprawdę wielkiego pakietu!

Jak używać:

  • mieć Docker działa
  • idź github.com/karalabe/xgo
  • xgo --targets = windows/amd64 ./

Istnieje dużo więcej opcji!

0

Używam pierwszego podejścia. Tutaj jest to zadanie z trudem, z kodem kompilacji. Jeśli flaga produkcji jest ustawiona, uruchamia ona GOOS=linux CGO_ENABLED=0 go build zamiast go build. Zatem binarne będą działać wewnątrz kontenera Döcker

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

Można utworzyć kontener Docker z odrębnego systemu operacyjnego trzeba do pliku wykonywalnego i zmapować głośność do katalogu src. Uruchom kontener i wykonaj plik wykonywalny z poziomu kontenera. W końcu otrzymujesz plik binarny, który możesz uruchomić na odrębnym systemie operacyjnym.