Какой пакет я должен установить вместо libpcre ++ - dev, чтобы использовать C-код в Alpine Golang? - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть программа Golang внутри контейнера докера (я использую Ubuntu 18).Также я использую github.com / glenn-brown / golang-pkg-pcre / src / pkg / pcre для регулярных выражений в своем приложении Golang.Перед использованием этой библиотеки я должен установить libpcre++-dev следующим образом:

sudo apt-get установить libpcre ++ - dev

Но я использую golang: alpine в моем Dockerfile, и этонет библиотеки libpcre++-dev в альпийских пакетах.

Какой пакет я должен установить вместо libpcre++-dev?

ps Я пытался установить libc6-compat, pcre pcre-dev, libpcrecpp но я вижу эту ошибку:

github.com / glenn-brown / golang-pkg-pcre / src / pkg / pcre /go/pkg/mod/github.com/glenn-brown/golang-pkg-pcre@v0.0.0-20120522223659-48bb82a8b8ce/src/pkg/pcre/pcre.go:52:10: фатальная ошибка: pcre.h: нет такого файла или каталога #include ^ ~~~~~~~ сборка прекращена

Мой Dockerfile:

FROM golang:alpine

RUN apk update
RUN apk upgrade
RUN apk add --update --no-cache build-base gcc g++ pcre pcre-dev libc6-compat

# Install git + SSL ca certificates.
# Git is required for fetching the dependencies.
# Ca-certificates is required to call HTTPS endpoints.
RUN apk update && apk add --no-cache curl git ca-certificates tzdata \
 && update-ca-certificates 2> /dev/null || true

Я создаю свое приложение следующим образом:

- CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-w -s" -o bin/backend ./cmd/backend/main.go

РЕДАКТИРОВАТЬ

Я изменил свой Dockerfile (добавьте строку ниже)

RUN apk add --update --no-cache build-base gcc g++ pcre pcre-dev libc6-compat

И теперь у меня новая ошибка:

Ошибказагрузка разделяемой библиотеки libpcre.so.1: нет такого файла или каталога (необходим для / bin / backend)

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Вместо этого вы можете использовать один из golang образов на основе Debian.В любом случае, к тому времени, когда вы устанавливаете GNU libc и полный набор инструментов на C, вы не сможете сэкономить много места по сравнению с базовым образом Alpine.Вы можете (и должны) использовать многоэтапную сборку, в которой конечное изображение содержит только ваш скомпилированный двоичный файл, и это может использовать альпийскую базу.

Результат будет выглядеть примерно так:

# Build-time image; just has the parts needed to run `go build`
FROM golang:1.12-buster AS build

# Install additional build-time tools
RUN apt-get update \
 && apt-get install --assume-yes \
      build-essential ca-certificates git-core tzdata \
      libpcre++-dev

# Build your application
WORKDIR /app
COPY . .
ENV GO111MODULE=on
RUN go build -o myapp ./cmd/myapp

# Runtime image; has only what we need to run the application
FROM alpine:3.10
# Note that you'll need the shared library for libpcre++
RUN apk add ca-certificates tzdata libpcrepp
COPY --from=build /app/myapp /usr/bin/myapp
CMD ["myapp"]
0 голосов
/ 21 сентября 2019

Вы можете попробовать один из них, так как оба пакета

RUN apk add --virtual build-dependencies 
RUn apk add --no-cache build-base gcc

build-essential - это метапакет (пакет, который устанавливает много других пакетов, таких как g ++ и gcc: GNU C & C ++компиляторы).

Или вы можете установить Alpine SDK.

Вы можете начать с alpine-sdk, который представляет собой «метапакет, который загружает самые необходимые используемые пакеты».создавать новые пакеты. "http://wiki.alpinelinux.org/wiki/Developer_Documentation имеет больше информации.

RUN apk add --update alpine-sdk

docker-alpine-Issues-24

Или вы можете использовать golang: последний, который будетотлично работает.

FROM golang:latest
RUN apt-get update 
RUN apt-get install libpcre++-dev -y
...