Контейнер Docker с golang http. Получить сертификат ошибки, подписанный неизвестным органом

У меня есть контейнер с Golang, который вызывает https api. Я использую скретч-контейнер, и когда я пытаюсь запустить его, я получаю certificate signed by unknown authority

url := "https://restcountries.eu/rest/v2/name/" + params.Get("country")
response, err := http.Get(url)

Мой Dockerfile выглядит так:

FROM golang:1.15 AS builder
WORKDIR /GreetingAPI
COPY . /greeting
WORKDIR /greeting
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o greeting

FROM scratch
COPY --from=builder /greeting .
CMD ["./greeting"]

Я обновил свой Dockerfile с помощью этого ответного ПО. Но когда я пытаюсь построить контейнер, я получаю ERROR: "/ca-certificates.crt" not found: not found и failed to solve: rpc error: code = Unknown desc = failed to compute cache key: "/ca-certificates.crt" not found: not found

FROM golang:1.15 AS builder
WORKDIR /GreetingAPI
COPY . /greeting
WORKDIR /greeting
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o greeting

FROM scratch
ADD ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /greeting .
CMD ["./greeting"]

person Community    schedule 14.12.2020    source источник
comment
Проверьте этот комментарий https://stackoverflow.com/a/12122718/13106495   -  person ismail durmaz    schedule 15.12.2020


Ответы (2)


Возможно, мне потребовалось внести более ясность в связанный ответ, копия в этом первом примере была одноэтапным примером, в котором у вас был файл сертификата для вставки в контекст сборки (каталог, в котором обычно находится ваш Dockerfile):

FROM scratch
ADD ca-certificates.crt /etc/ssl/certs/
ADD main /
CMD ["/main"]

У вас многоэтапное построение, и вы можете следовать многоступенчатому методу во второй половине связанного ответа. Это устанавливает сертификаты на другом этапе от поставщика дистрибутива и копирует их в ваш рабочий этап:

FROM golang:alpine as build
RUN apk --no-cache add ca-certificates
WORKDIR /go/src/app
COPY . .
RUN CGO_ENABLED=0 go-wrapper install -ldflags '-extldflags "-static"'

FROM scratch
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=build /go/bin/app /app
ENTRYPOINT ["/app"]

Однако во втором примере в качестве основы для первого этапа использовался Alpine с использованием apk. (Также предполагалось, что сертификаты должны быть установлены в базовом образе, что оказалось не так в текущих образах golang.) В вашем примере он основан на Debian в образе golang:1.15. Для этого обычно требуются apt-get команды, но в этом случае пакет ca-certificates уже установлен, поэтому вы можете просто скопировать результаты:

FROM golang:1.15 AS builder
COPY . /greeting
WORKDIR /greeting
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o greeting

FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /greeting /
CMD ["/greeting"]
person BMitch    schedule 15.12.2020

Установите сертификат CA на этапе сборки и скопируйте его в окончательный образ. Что-то вроде:

FROM golang:1.15 AS builder
RUN apk update
RUN apk add -U --no-cache ca-certificates && update-ca-certificates
WORKDIR /GreetingAPI
COPY . /greeting
WORKDIR /greeting
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o greeting

FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /greeting .
CMD ["./greeting"]
person gipsy    schedule 15.12.2020