无法在具有Linux Runner的Docker容器中执行GO二进制文件
Go和二进制文件是docker映像的一部分 我尝试了所有可能的组合来构建Go二进制无法在具有Linux Runner的Docker容器中执行GO二进制文件,docker,ubuntu,go,Docker,Ubuntu,Go,Go和二进制文件是docker映像的一部分 我尝试了所有可能的组合来构建Go二进制 export GOARCH=386 && export GOOS=linux && go build ./cmd/status export GOARCH=amd64 && export GOOS=windows && go build ./cmd/status $ uname -a Linux runner-4KP_No95-project-3
export GOARCH=386 && export GOOS=linux && go build ./cmd/status
export GOARCH=amd64 && export GOOS=windows && go build ./cmd/status
$ uname -a
Linux runner-4KP_No95-project-35871-concurrent-0 44.44.444-115.233.amzn1.x86_64 #1 SMP Thu Feb 27 23:49:15 UTC 2020 x86_64 GNU/Linux
将错误获取为
/pipeline/status: /pipeline/status: cannot execute binary file
docker文件中的示例部分是-
ARG GOLANG_VERSION=1.14
FROM golang:${GOLANG_VERSION} as build-helpers
ENV GOPRIVATE=code.abcd.com
RUN mkdir -p /pipeline-helpers
ADD /reusable-aspects/ci-caching/golang-preheat-cache /golang-preheat-cache
RUN cd /golang-preheat-cache && go mod download
ADD helpers/go-pipeline-commands /pipeline-helpers/
RUN cd /pipeline-helpers && CGO_ENABLED=0 GOOS=linux make
FROM alpine
RUN mkdir -p /pipeline
WORKDIR /pipeline
COPY --from=build-helpers /pipeline-helpers/commit .
COPY --from=build-helpers /pipeline-helpers/status .
RUN chmod a+x commit
RUN chmod a+x status
ENTRYPOINT ["./commit"]
CMD []
下面添加了生成Go二进制文件的图像日志
[0KRunning with gitlab-runner 11.11.2 (ac2a293c)
[0;m[0K on aws-build-runner-scheduler 8616255e
[0;msection_start:1590231123:prepare_executor
[0K[0KUsing Docker executor with image gcr.io/kaniko-project/executor:debug ...
[0;m[0KPulling docker image gcr.io/kaniko-project/executor:debug ...
[0;m[0KUsing docker image sha256:adasdasdasdasdasdasdasdsa for gcr.io/kaniko-project/executor:debug ...
[0;msection_end:1590231124:prepare_executor
[0Ksection_start:1590231124:prepare_script
[0KRunning on runner-8616123e-project-12312-concurrent-0 via ip-12-122-122-122...
section_end:1590231125:prepare_script
[0Ksection_start:1590231125:get_sources
[0KReinitialized existing Git repository in /builds/abcde/pipeline/projetname/.git/
[32;1mFetching changes...[0;m
From https://code.abc.com/abcde/pipeline/projetname
* [new ref] refs/pipelines/5679048 -> refs/pipelines/5679048
0286714..043832e feat/qaPipelineDeploy -> origin/feat/qaPipelineDeploy
[32;1mChecking out 043832ea as feat/qaPipelineDeploy...[0;m
Removing helpers/bash-commons/src/welcome/version-info-pipeline.txt
[32;1mSkipping Git submodules setup[0;m
section_end:1590231128:get_sources
[0Ksection_start:1590231128:restore_cache
[0Ksection_end:1590231130:restore_cache
[0Ksection_start:1590231130:download_artifacts
[0Ksection_end:1590231132:download_artifacts
[0Ksection_start:1590231132:build_script
[0K[32;1m$ mkdir -p /kaniko/.docker[0;m
[32;1m$ export IMAGE_TAG=${CI_COMMIT_TAG:=$CI_COMMIT_REF_SLUG}[0;m
[32;1m$ imagename=$CI_REGISTRY_IMAGE/helpers:$IMAGE_TAG[0;m
[36mINFO[0m[0001] Resolved base name golang:1.14 to build-helpers
[36mINFO[0m[0001] Retrieving image manifest golang:1.14
[36mINFO[0m[0002] Retrieving image manifest golang:1.14
[36mINFO[0m[0003] Retrieving image manifest alpine
[36mINFO[0m[0004] Retrieving image manifest alpine
[36mINFO[0m[0005] Built cross stage deps: map[0:[/pipeline-helpers/commit /pipeline-helpers/status]]
[36mINFO[0m[0005] Retrieving image manifest golang:1.14
[36mINFO[0m[0005] Retrieving image manifest golang:1.14
[36mINFO[0m[0006] Executing 0 build triggers
[36mINFO[0m[0006] Unpacking rootfs as cmd RUN mkdir -p /pipeline-helpers requires it.
[36mINFO[0m[0021] ENV GOPRIVATE=code.abc.com
[36mINFO[0m[0021] RUN mkdir -p /pipeline-helpers
[36mINFO[0m[0021] Taking snapshot of full filesystem...
[36mINFO[0m[0022] Resolving 28120 paths
[36mINFO[0m[0025] cmd: /bin/sh
[36mINFO[0m[0025] args: [-c mkdir -p /pipeline-helpers]
[36mINFO[0m[0025] Running: [/bin/sh -c mkdir -p /pipeline-helpers]
[36mINFO[0m[0025] Taking snapshot of full filesystem...
[36mINFO[0m[0025] Resolving 28121 paths
[36mINFO[0m[0027] Using files from context: [/builds/abcde/pipeline/projetname/projetname-reusable-aspects/ci-caching/golang-preheat-cache]
[36mINFO[0m[0027] ADD /projetname-reusable-aspects/ci-caching/golang-preheat-cache /golang-preheat-cache
[36mINFO[0m[0027] Resolving 3 paths
[36mINFO[0m[0027] Taking snapshot of files...
[36mINFO[0m[0027] RUN cd /golang-preheat-cache && go mod download
[36mINFO[0m[0027] cmd: /bin/sh
[36mINFO[0m[0027] args: [-c cd /golang-preheat-cache && go mod download]
[36mINFO[0m[0027] Running: [/bin/sh -c cd /golang-preheat-cache && go mod download]
[36mINFO[0m[0033] Taking snapshot of full filesystem...
[36mINFO[0m[0033] Resolving 50967 paths
[36mINFO[0m[0045] Using files from context: [/builds/abcde/pipeline/projetname/helpers/go-pipeline-commands]
[36mINFO[0m[0045] ADD helpers/go-pipeline-commands /pipeline-helpers/
[36mINFO[0m[0045] Resolving 25 paths
[36mINFO[0m[0045] Taking snapshot of files...
[36mINFO[0m[0045] RUN cd /pipeline-helpers && CGO_ENABLED=0 GOOS=linux make
[36mINFO[0m[0045] cmd: /bin/sh
[36mINFO[0m[0045] args: [-c cd /pipeline-helpers && CGO_ENABLED=0 GOOS=linux make]
[36mINFO[0m[0045] Running: [/bin/sh -c cd /pipeline-helpers && CGO_ENABLED=0 GOOS=linux make]
[34m > Download dependencies [0m
[37m > Tidy dependencies [0m
[34m go mod tidy [0m
[37m > Building the binary [0m
[34m go build ./cmd/commit [0m
[34m go build ./cmd/query-qa-pipeline-status [0m
[37m > Format code [0m
[34m go fmt ./... [0m
[37m > Run unit tests [0m
[34m go test -run TestUnit ./... [0m
ok code.abc.com/abcde/pipeline/projetname/helpers/cmd/commit 0.005s
ok code.abc.com/abcde/pipeline/projetname/helpers/cmd/status 0.005s
[37m > Find static code issues [0m
[34m go vet ./... [0m
[36mINFO[0m[0055] Taking snapshot of full filesystem...
[36mINFO[0m[0056] Resolving 52425 paths
[36mINFO[0m[0061] RUN echo " Golang version: `go version`" >> /pipeline-helpers/version-info-pipeline.txt
[36mINFO[0m[0061] cmd: /bin/sh
[36mINFO[0m[0061] args: [-c echo " Golang version: `go version`" >> /pipeline-helpers/version-info-pipeline.txt]
[36mINFO[0m[0061] Running: [/bin/sh -c echo " Golang version: `go version`" >> /pipeline-helpers/version-info-pipeline.txt]
[36mINFO[0m[0061] Taking snapshot of full filesystem...
[36mINFO[0m[0065] Resolving 52426 paths
[36mINFO[0m[0069] RUN echo " projetname type: Helpers" >> /pipeline-helpers/version-info-pipeline.txt
[36mINFO[0m[0069] cmd: /bin/sh
[36mINFO[0m[0069] args: [-c echo " projetname type: Helpers" >> /pipeline-helpers/version-info-pipeline.txt]
[36mINFO[0m[0069] Running: [/bin/sh -c echo " projetname type: Helpers" >> /pipeline-helpers/version-info-pipeline.txt]
[36mINFO[0m[0069] Taking snapshot of full filesystem...
[36mINFO[0m[0069] Resolving 52426 paths
[36mINFO[0m[0072] RUN echo " Commit hash: `echo ${CI_COMMIT_SHA}`" >> /pipeline-helpers/version-info-pipeline.txt
[36mINFO[0m[0072] cmd: /bin/sh
[36mINFO[0m[0072] args: [-c echo " Commit hash: `echo ${CI_COMMIT_SHA}`" >> /pipeline-helpers/version-info-pipeline.txt]
[36mINFO[0m[0072] Running: [/bin/sh -c echo " Commit hash: `echo ${CI_COMMIT_SHA}`" >> /pipeline-helpers/version-info-pipeline.txt]
[36mINFO[0m[0072] Taking snapshot of full filesystem...
[36mINFO[0m[0072] Resolving 52426 paths
[36mINFO[0m[0076] Saving file pipeline-helpers/commit for later use
[36mINFO[0m[0076] Saving file pipeline-helpers/version-info-pipeline.txt for later use
[36mINFO[0m[0076] Saving file pipeline-helpers/status for later use
[36mINFO[0m[0076] Deleting filesystem...
[36mINFO[0m[0077] Retrieving image manifest alpine
[36mINFO[0m[0079] Retrieving image manifest alpine
[36mINFO[0m[0080] Executing 0 build triggers
[36mINFO[0m[0080] Unpacking rootfs as cmd RUN mkdir -p /pipeline requires it.
[36mINFO[0m[0080] RUN mkdir -p /pipeline
[36mINFO[0m[0080] Taking snapshot of full filesystem...
[36mINFO[0m[0080] Resolving 482 paths
[36mINFO[0m[0080] cmd: /bin/sh
[36mINFO[0m[0080] args: [-c mkdir -p /pipeline]
[36mINFO[0m[0080] Running: [/bin/sh -c mkdir -p /pipeline]
[36mINFO[0m[0080] Taking snapshot of full filesystem...
[36mINFO[0m[0080] Resolving 483 paths
[36mINFO[0m[0080] WORKDIR /pipeline
[36mINFO[0m[0080] cmd: workdir
[36mINFO[0m[0080] Changed working directory to /pipeline
[36mINFO[0m[0080] COPY --from=build-helpers /pipeline-helpers/commit .
[36mINFO[0m[0080] Resolving 1 paths
[36mINFO[0m[0080] Taking snapshot of files...
[36mINFO[0m[0080] Resolving 1 paths
[36mINFO[0m[0080] Taking snapshot of files...
[36mINFO[0m[0081] Resolving 1 paths
[36mINFO[0m[0081] Taking snapshot of files...
[36mINFO[0m[0081] COPY --from=build-helpers /pipeline-helpers/status .
[36mINFO[0m[0081] Resolving 1 paths
[36mINFO[0m[0081] Taking snapshot of files...
[36mINFO[0m[0081] RUN chmod a+x commit
[36mINFO[0m[0081] cmd: /bin/sh
[36mINFO[0m[0081] args: [-c chmod a+x commit]
[36mINFO[0m[0081] Running: [/bin/sh -c chmod a+x commit]
[36mINFO[0m[0081] Taking snapshot of full filesystem...
[36mINFO[0m[0081] Resolving 487 paths
[36mINFO[0m[0081] No files were changed, appending empty layer to config. No layer added to image.
[36mINFO[0m[0081] cmd: /bin/sh
[36mINFO[0m[0081] Taking snapshot of full filesystem...
[36mINFO[0m[0081] Resolving 487 paths
[36mINFO[0m[0081] No files were changed, appending empty layer to config. No layer added to image.
[36mINFO[0m[0081] RUN chmod a+x status
[36mINFO[0m[0081] cmd: /bin/sh
[36mINFO[0m[0081] args: [-c chmod a+x status]
[36mINFO[0m[0081] Running: [/bin/sh -c chmod a+x status]
[36mINFO[0m[0081] Taking snapshot of full filesystem...
[36mINFO[0m[0081] Resolving 487 paths
[36mINFO[0m[0081] No files were changed, appending empty layer to config. No layer added to image.
[36mINFO[0m[0081] CMD []
[32;1m$ echo projetname_IMAGE_TAG=${IMAGE_TAG}[0;m
projetname_IMAGE_TAG=feat-qapipelinedeploy
section_end:1590231218:build_script
[0Ksection_start:1590231218:after_script
[0Ksection_end:1590231219:after_script
[0Ksection_start:1590231219:archive_cache
[0Ksection_end:1590231220:archive_cache
[0Ksection_start:1590231220:upload_artifacts_on_success
[0Ksection_end:1590231222:upload_artifacts_on_success
[0K[32;1mJob succeeded
从Docker GIT.YML文件中,我调用bash./status
命令。它抛出错误,因为无法执行二进制文件
在上面的docker映像生成之后,还有一个docker文件在不同的阶段生成。此docker映像用于在YML文件中进行测试
RG GO_VERSION=1.14
# Install OpenAPI Validator
FROM golang:${GO_VERSION} AS openapivalidatorbuilder
WORKDIR /work
ENV GOPRIVATE=code.abcd.com
COPY /reusable-aspects/enforcement/open-api-check/ .
RUN go build .
ARG PIPELINE_HELPER=docker.abcd.com/projectName/pipeline/projects/helpers:master
FROM ${PIPELINE_HELPER} as helper
FROM golang:${GO_VERSION}
ENV GOPRIVATE=code.abcd.com
ADD /reusable-aspects/ci-caching/golang-preheat-cache /golang-preheat-cache
RUN cd /golang-preheat-cache && go mod download
RUN curl -L https://github.com/a8m/envsubst/releases/download/v1.1.0/envsubst-`uname -s`-`uname -m` -o envsubst
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
nodejs \
npm \
unzip
RUN npm --version
RUN npm install -g \
npm@6.11 \
serverless@1.51
RUN apt-get install -y \
# Install ruby and CFN_NAG
ruby-dev \
ruby-json \
ruby \
ruby-bundler \
# Install AWS CLI
awscli \
jq \
figlet
RUN rm -rf /var/cache/apk/*
RUN gem install cfn-nag --no-rdoc --no-ri
RUN mkdir /pipeline
ADD helpers/bash-commons/src/welcome /pipeline
RUN echo " Golang version: `go version`" >> /pipeline/version-info-pipeline.txt
RUN echo " Node version: `node -v`" >> /pipeline/version-info-pipeline.txt
RUN echo " Serverless version: `serverless -v`" >> /pipeline/version-info-pipeline.txt
RUN echo " projects type: Information Serverless Golang" >> /pipeline/version-info-pipeline.txt
COPY --from=openapivalidatorbuilder /work/open-api-check /pipeline/open-api-check
RUN chmod a+x /pipeline/open-api-check
COPY --from=helper /pipeline/hash /pipeline
COPY --from=helper /pipeline/status /pipeline
golang:1.14
不是alpine
base,而是debian
base。因此,当然不能在alpine image中运行debian构建二进制文件
试着替换
来自golang:${golang_VERSION}作为生成帮助程序
与
来自golang:${golang_VERSION}-alpine as构建帮助程序
并添加以下行以下载构建二进制文件所需的库
RUN apk update && \
apk --update upgrade && \
apk add --no-cache ca-certificates gcc musl-dev git && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
更新
添加make并将apk更新和添加放在golang的下:…
FROM golang:${GOLANG_VERSION}-alpine as build-helpers
RUN apk update && \
apk --update upgrade && \
apk add --no-cache ca-certificates gcc musl-dev git make && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
OP更新后更新问题
由于您正在使用basegolang:${VERSION}
将alpine
构建状态二进制文件从helper
复制到您的最终映像,这就是debian
环境,因此它当然无法运行
我建议您在所有构建阶段或最终docker映像中只使用一个环境(alpine
或debian
)
因此,第一个docker映像的第一个构建状态应该是
FROM golang:${GOLANG_VERSION}
最后的图像请使用debian而不是alpine
FROM debian
您能否至少为映像包含
FROM
行,以及生成二进制文件的早期构建阶段?(您显示的构建命令将生成32位Linux和64位Windows二进制文件,这两个命令都将生成您显示的错误。)添加。你们能检查一下吗?这里令人惊讶的是,有两个二进制文件,commit(在项目开始时编写的非常旧的一个)和status(新编写的状态)。提交工作正常。正在构建的二进制文件是否使用CGO?Alpine linux使用与大多数发行版不同的C运行时。“无法执行二进制文件”错误通常会发生,因为二进制文件存在时缺少依赖的DLL。我也不知道你为什么要摆弄GOARCH和GOOS。谷歌将为Linux或Windows构建一个二进制文件。它应该与容器操作系统相匹配。e、 g.“来自阿尔卑斯山”。然后你会期望GOOS是linux(这是在linux上构建go应用程序的默认设置。Arch将根据32位或64位进行默认设置。现在大多数系统都是64位的…所以请别管它。请检查c运行时的依赖项,如我前面的评论所示。在完成上述更改后,我得到以下运行的错误信息[0037]:[/bin/sh-c cd/pipeline helpers&&CGO_ENABLED=0 GOOS=linux make]/bin/sh:make:not found更新了将make添加到apk add的答案在更改docker后,我没有收到任何错误。但是,我仍然收到错误,因为无法执行二进制文件…$uname-m x86_64$uname-a Linux runner-4KR_No93-project-12345-concurrent-04.44.111-105.231.amzn1.x86_64#1 SMP-Thu 2月27日23:49:15 UTC 2020 x86_64GNU/Linux$bash/pipeline/status-GITLAB_API_TOKEN=$PERSONAL_API_TOKEN/pipeline/status:/pipeline/status:无法执行二进制文件错误:作业失败:退出代码1I已更新我的问题。还有一个docker文件在不同阶段生成。此docker映像用于在YML文件中进行测试。在第一阶段,GoLangMaker作业获取s已执行。在此docker文件中,我已根据您的建议进行了更改。在第二阶段,另一个docker映像已生成,称为无服务器docker。由tis docker文件生成的映像用于测试。您正在从alpine helper映像复制状态二进制文件以在debian环境中运行。这就是为什么它不起作用。您应该只使用我们e阿尔卑斯或debian用于所有构建阶段和最终图像。