无法在具有Linux Runner的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

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-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更新后更新问题

由于您正在使用base
golang:${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用于所有构建阶段和最终图像。