Impossible d'exécuter le fichier binaire GO dans les conteneurs Docker avec Linux Runner
Go et les binaires faisaient partie de notre image de docker.
J'ai essayé toutes les combinaisons possibles pour construire 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
Obtenir une erreur comme
/pipeline/status: /pipeline/status: cannot execute binary file
La section d'exemple du fichier docker est -
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 []
Les journaux d'image où les binaires Go sont compilés sont ajoutés ci-dessous
[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
À partir du fichier Docker GIT.YML, j'appelle la bash ./status
commande. Il jette une erreur car ne peut pas exécuter le fichier bianry
Il existe un autre fichier docker qui est construit à une étape différente après que l'image docker ci-dessus est générée. Cette image docker est utilisée pour les tests dans le fichier 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 \
[email protected] \
[email protected]
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
n'est pas une alpine
base mais une debian
base. Donc, bien sûr, vous ne pouvez pas exécuter le binaire de compilation Debian en image alpine.
Essayez de remplacer
FROM golang:${GOLANG_VERSION} as build-helpers
avec
FROM golang:${GOLANG_VERSION}-alpine as build-helpers
et ajoutez les lignes suivantes pour télécharger la bibliothèque nécessaire à la construction du binaire
RUN apk update && \
apk --update upgrade && \
apk add --no-cache ca-certificates gcc musl-dev git && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
METTRE À JOUR
Ajoutez make et mettez la mise à jour apk et ajoutez juste sous 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/*
MISE À JOUR APRÈS UNE QUESTION DE MISE À JOUR OP
Étant donné que vous copiez le alpine
binaire d'état de construction de helper
vers votre image finale avec base golang:${VERSION}
, qui est l' debian
environnement, bien sûr, il ne peut pas fonctionner.
Je vous recommande de n'utiliser qu'un seul environnement ( alpine
ou debian
) pour toutes les étapes de construction ou l'image finale du docker.
Le premier état de construction de votre première image docker devrait donc être
FROM golang:${GOLANG_VERSION}
et l'image finale s'il vous plaît utiliser debian
au lieu de alpin
FROM debian