ฉันมีปัญหากับบิลด์แบบหลายสเตจที่ไบนารี่ที่สร้างขึ้นในสเตจที่ 1 ถูกคัดลอกไปยังสเตจ 2 อย่างถูกต้อง แต่เมื่อคุณลองและรันมัน ไม่พบไฟล์ปฏิบัติการ
ไฟล์นักเทียบท่าคือ:
FROM golang as goimage
ENV SRC=/go/src/
RUN mkdir -p /go/src/
WORKDIR /go/src/go_docker
RUN git clone https://github.com/bryonbaker/simple-microservice.git /go/src/go_docker/ \
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64
RUN go get github.com/gorilla/mux
RUN go build -o bin/go_docker
FROM alpine:latest AS microservice
RUN apk --no-cache add bash
ENV WORK_DIR=/docker/bin
WORKDIR $WORK_DIR
COPY --from=goimage /go/src/go_docker/bin/ ./
# Put a container-image version identifier in the root directory.
ARG VERSION=1.0
RUN echo $VERSION > image_version
EXPOSE 10000
#CMD ["go_docker"]
ผลลัพธ์คือ:
$ docker run -ti -p 80:10000 go-docker: ล่าสุด
/docker/bin # lsgo_docker image_version
/docker/bin # ./go_docker /bin/sh: ./go_docker: ไม่พบ
/docker/bin #
ถ้าฉันเรียกใช้ไบนารี่จากคอนเทนเนอร์ goimage ระดับกลางที่สร้างขึ้น มันก็จะทำงานได้ดี ขนาดไฟล์ตรงกัน...
หมายเหตุ: ใน dockerfile นี้ ฉันได้ใส่ความคิดเห็นเกี่ยวกับ CMD และกำลังทดสอบผ่านเชลล์ หากคุณไม่ใส่ข้อคิดเห็น CMD คุณจะประสบปัญหาเดียวกัน:
นักเทียบท่ารัน go-docker: นักเทียบท่าล่าสุด: การตอบสนองข้อผิดพลาดจาก daemon: การสร้างรันไทม์ OCI ล้มเหลว: container_linux.go:344: การเริ่มต้นกระบวนการคอนเทนเนอร์ทำให้เกิด "exec: \"go_docker\": ไม่พบไฟล์ปฏิบัติการใน $PATH": ไม่ทราบ ข้อผิดพลาด ERRO[0001] กำลังรอคอนเทนเนอร์: บริบทถูกยกเลิก
ฉันได้สร้างโค้ดทดสอบใน git repo สู่สาธารณะแล้วหากคุณต้องการดู
ขอบคุณล่วงหน้า