我有一个自动化的构建系统,我将Drone.io 8.5 Docs置于构建上,并将它们放在输出Golang构建的二进制的脚本中。
然后我使用无人机(HA)来构建最终用于生产中的Dockefile。
我正在尝试通过使用无人机构建新的无人机容器来更新无人机,但它们都带有相同的错误:
standard_init_linux.go:185: exec user process caused "no such file or directory"
在我看来,一切都在正确的位置。
我的构建脚本拉了我想要的sha,并执行构建步骤:
#! /bin/bash
set -e
set -u
PKG=github.com/drone/drone
REPO=https://${PKG}.git
SHA=81103a98208b0bfc76be5b07194f359fbc80183b
PATH=$GOPATH/bin:$PATH
cd $GOPATH
git clone $REPO src/${PKG}
cd src/${PKG}
git checkout -qf $SHA
# setup drone
go get -u github.com/drone/drone-ui/dist
go get -u golang.org/x/net/context
go get -u golang.org/x/net/context/ctxhttp
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go install github.com/drone/drone/cmd/drone-agent
go install github.com/drone/drone/cmd/drone-server
mkdir release
cp $GOPATH/bin/drone-server release/drone-server
echo "Complete"
基于该版本的官方码头(8.5,下面),无人机Docker插件构建了我的容器:
:docker:
image: plugins/docker
repo: myprivatereg.com/org/docker-drone
dockerfile: /drone/src/github.com/drone/drone/Dockerfile
context: /drone/src/github.com/drone/drone
tags:
- ${DRONE_BRANCH}-latest
- ${DRONE_COMMIT}
在这种情况下,dockerfile是:
# docker build --rm -t drone/drone .
FROM drone/ca-certs
EXPOSE 8000 9000 80 443
ENV DATABASE_DRIVER=sqlite3
ENV DATABASE_CONFIG=/var/lib/drone/drone.sqlite
ENV GODEBUG=netdns=go
ENV XDG_CACHE_HOME /var/lib/drone
ADD release/drone-server /bin/
ENTRYPOINT ["/bin/drone-server"]
我一生无法看到我的问题,看起来二进制会在正确的位置。唯一的问题是构建环境,但我手动以相同的结果破坏了这些步骤。
您的构建问题是您没有构建可以在Docker容器内执行的二进制文件,因此exec user process
错误。
您问题的快速修复是在go install
中添加交叉补偿标志。这也将导致将二进制放置在一个略有不同的位置,因此您的构建文件看起来像这样:
GOOS=linux GOARCH=386 go install github.com/drone/drone/cmd/drone-agent
GOOS=linux GOARCH=386 go install github.com/drone/drone/cmd/drone-server
mkdir release
cp $GOPATH/bin/linux_386/drone-server release/drone-server
适当的方法(更复杂)的方法是首先使用构建步骤的多阶段docerfile,请参见例如此博客文章带有示例。