Cannot execute GO binary file in Docker Containers having Linux Runner

Viewed 1636

Go and binaries were part of our docker image.

I tried all possible combinations to build Go binary

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

Getting error as

/pipeline/status: /pipeline/status: cannot execute binary file

Sample section from docker file is -

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 []

Image logs where Go binaries are build are added below

[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

From Docker GIT.YML file , I am calling bash ./status command. It throws error as can not execute bianry file

There is one more docker file that gets build in a different stage after above docker image gets build. This docker image is used for testing in YML file.

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
1 Answers

golang:1.14 is not alpine base but debian base. So of course you cannot run the debian build binary in alpine image.

Try replace

FROM golang:${GOLANG_VERSION} as build-helpers

with

FROM golang:${GOLANG_VERSION}-alpine as build-helpers

and add following lines to download necessary lib for building binary

RUN apk update && \
  apk --update upgrade && \
  apk add --no-cache ca-certificates gcc musl-dev git && \
  update-ca-certificates && \
  rm -rf /var/cache/apk/*

UPDATE

Add make and put the apk update and add right under FROM 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/*

UPDATE AFTER OP UPDATE QUESTION

Since you are copying the alpine build status binary from helper to your final image with base golang:${VERSION}, which is debian environment, of course it cannot run.

I recommend you to use only one environment (alpine or debian) for all the build stages or final docker image.

So you first docker image's first build state should be

FROM golang:${GOLANG_VERSION}

and the final image please use debian instead of alpine

FROM debian
Related