2016-10-31 3 views
5

Я пытаюсь запустить контейнер докеров с продавцом. Это мой Dockerfilegodep vendor with docker

FROM golang:alpine 
EXPOSE 8080 

RUN mkdir /app 
ADD . /app/ 
WORKDIR /app 
RUN go build -o myapp . 
CMD ["/app/myapp"] 

и мой main.go

package main 

import (
    "fmt" 
    "log" 
    "net/http" 

    "github.com/gorilla/mux" 
) 

func main() { 

    r := mux.NewRouter() 
    r.HandleFunc("/", Hello) 

    http.Handle("/", r) 
    fmt.Println("Starting up on 8080") 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

func Hello(w http.ResponseWriter, req *http.Request) { 
    fmt.Fprintln(w, "Hello world!") 
} 

Я использую godep для vendoring LIBS, он работает в моей локальной машине, но когда я пытаюсь запустить его с докер с:

docker build -t myapp-img . 
docker run -p 8080:8080 --name myapp-cnt myapp-img 

у меня есть следующее сообщение об ошибке:

main.go:8:2: cannot find package "github.com/gorilla/mux" in any of: 
     /usr/local/go/src/github.com/gorilla/mux (from $GOROOT) 
     /go/src/github.com/gorilla/mux (from $GOPATH) 

Я не понимаю, чего не хватает.

ответ

4

Ошибка. Он расскажет вам все, чего хочет будущий Гофер.

я буду считать, что вы скопировали Gorilla Mux в директорию/поставщика вашего приложения в вашей локальной машине, например, так:

./main.go # this is your myapp code you are coping 
./vendor/github.com/gorilla/mux # for vendoring, this must exist 

Если вы хотите узнать больше о vendoring см мой популярный ответ здесь :

How should I use vendor in Go 1.6?

Теперь, чтобы исправить эту ошибку, предполагая, что вы сделали выше ...

суслика должен себе t действительный $GOPATH, прежде чем вы сможете построить. Это отсутствует в вашем файле Docker.

FROM golang:1.7-alpine 
EXPOSE 8080 

# setup GOPATH and friends 
# 
# TECHNICALLY, you don't have to do these three cmds as the 
# golang:alpine image actually uses this same directory structure and 
# already has $GOPATH set to this same structure. You could just 
# remove these two lines and everything below should continue to work. 
# 
# But, I like to do it anyways to ensure my proper build 
# path in case I experiment with different Docker build images or in 
# case the #latest image changes structure (you should really use 
# a tag to lock down what version of Go you are using - note that I 
# locked you to the docker image golang:1.7-alpine above, since that is 
# the current latest you were using, with bug fixes). 
# 
RUN mkdir -p /go/src \ 
    && mkdir -p /go/bin \ 
    && mkdir -p /go/pkg 
ENV GOPATH=/go 
ENV PATH=$GOPATH/bin:$PATH 

# now copy your app to the proper build path 
RUN mkdir -p $GOPATH/src/app 
ADD . $GOPATH/src/app 

# should be able to build now 
WORKDIR $GOPATH/src/app 
RUN go build -o myapp . 
CMD ["/go/src/app/myapp"] 

Здесь работает ...

$ tree 
. 
├── Dockerfile 
├── main.go 
└── vendor 
    └── mydep 
     └── runme.go 

Исходный файл моего приложения:

$ cat main.go 
package main 

import (
     "fmt" 

     "mydep" 
) 

func main() { 
     fmt.Println(mydep.RunMe()) 
} 

Моя зависимость в моей vendor/ папке:

$ cat vendor/mydep/runme.go 
package mydep 

// RunMe returns a string that it worked! 
func RunMe() string { 
     return "Dependency Worked!" 
} 

сейчас , создайте и запустите изображение:

$ docker build --rm -t test . && docker run --rm -it test 
(snip) 
Step 8 : WORKDIR $GOPATH/src/app 
---> Using cache 
---> 954ed8e87ae0 
Step 9 : RUN go build -o myapp . 
---> Using cache 
---> b4b613f0a939 
Step 10 : CMD /go/src/app/myapp 
---> Using cache 
---> 3524025080df 
Successfully built 3524025080df 
Dependency Worked! 

Обратите внимание на последнюю строку, которая выводит вывод с консоли, Dependency Worked!.

Это работает, потому что:

  1. вы заявили, вы используете Vendoring, а это значит, у вас есть локальный каталог с именем ./vendor в корневом каталоге вашего кода приложения.
  2. , когда вы ADD . /go/src/app, вы также скопируете ./vendor на свой код приложения.
  3. вы скопировали свои файлы в соответствующую структуру установки, необходимую инструментам сборки Go, чтобы найти пакеты (и в этом случае каталог ./vendor в корневой папке вашего исходного кода).
+0

Thx для ответа я попытался использовать файл Dockerfile, но когда я запустил команду запуска docker, это похоже на то, что GOPATH не установлен. 'Ошибка ответа от демона: oci runtime error: exec:" $ GOPATH/src/app/myapp ": stat $ GOPATH/src/app/myapp: нет такого файла или каталога.' – sbouaked

+0

исправил файл Docker ($ GOPATH isn ' t доступно CMD). также добавлен полный рабочий пример (теперь, когда я работаю с ноутбуком). – eduncan911