エラーは正しいです。ゴーファーに必要なすべてのことを伝えています。
私はあなたがそうのように、ローカルマシンでアプリの/ベンダーのディレクトリにゴリラの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?
、あなたが上を行っていると仮定すると、そのエラーを修正する...
A Gopherのは、それ自体に必要有効な$GOPATH
をビルドすることができます。これはあなたのDockerfileにはありません。
ここ
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!
からの出力を出力し、最後の行。
ので、それは動作します:あなたはあなたがあなたのアプリケーションコードのルートに./vendor
と呼ばれるローカルディレクトリを持っていることを意味Vendoringを、使用している述べ
- 。
ADD . /go/src/app
の場合は、ローカルの./vendor
もアプリケーションコードにコピーしています。
- Goビルドツールがパッケージを見つけるために必要とする適切な
$GOPATH
セットアップ構造にファイルをコピーしました(この場合、ソースコードのルートフォルダ内の./vendor
ディレクトリ)。応答のための
Thxを、私はあなたのDockerfileを使用しようとしましたが、私はドッキングウィンドウrunコマンドを実行すると、それはGOPATHが設定されていないように見えるのです。 'ociランタイムエラー:exec:" $ GOPATH/src/app/myapp ":stat $ GOPATH/src/app/myapp:そのようなファイルまたはディレクトリはありません。 – sbouaked
Dockerfile($ GOPATH isn ' CMDに利用可能)。また、完全な実例も追加されました(今では私はラップトップと一緒に働いています)。 – eduncan911