GolangとDockerで外部パッケージをインポートするとビルドが失敗する

偽物:

Dockerを使用して、このような合流カフカの簡単な例を作成することはできません。おそらく、goパスまたは特別なビルドパラメーターを使用したトリックで、見つけることができず、goからすべてのデフォルトフォルダーを試しましたが、成功しませんでした。

Dockerfile

FROM golang:alpine AS builder

# Set necessary environmet variables needed for our image
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

ADD . /go/app

# Install librdkafka
RUN apk add librdkafka-dev pkgconf

# Move to working directory /build
WORKDIR /go/app

# Copy and download dependency using go mod
COPY go.mod .
RUN go mod download

# Copy the code into the container
COPY . .

# Build the application
RUN go build -o main .

# Run test
RUN go test ./... -v

# Move to /dist directory as the place for resulting binary folder
WORKDIR /dist

# Copy binary from build to main folder
RUN cp /go/app/main .

############################
# STEP 2 build a small image
############################
FROM scratch

COPY --from=builder /dist/main /

# Command to run the executable
ENTRYPOINT ["/main"]

ソース

import (
    "fmt"
    "github.com/confluentinc/confluent-kafka-go/kafka"
    "os"
)

func main() {

    if len(os.Args) != 3 {
        fmt.Fprintf(os.Stderr, "Usage: %s <broker> <topic>\n",
            os.Args[0])
        os.Exit(1)
    }

    broker := os.Args[1]
    topic := os.Args[2]

    p, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": broker})

    if err != nil {
        fmt.Printf("Failed to create producer: %s\n", err)
        os.Exit(1)
    }

    fmt.Printf("Created Producer %v\n", p)

    deliveryChan := make(chan kafka.Event)

    value := "Hello Go!"
    err = p.Produce(&kafka.Message{
        TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
        Value:          []byte(value),
        Headers:        []kafka.Header{{Key: "myTestHeader", Value: []byte("header values are binary")}},
    }, deliveryChan)

    e := <-deliveryChan
    m := e.(*kafka.Message)

    if m.TopicPartition.Error != nil {
        fmt.Printf("Delivery failed: %v\n", m.TopicPartition.Error)
    } else {
        fmt.Printf("Delivered message to topic %s [%d] at offset %v\n",
            *m.TopicPartition.Topic, m.TopicPartition.Partition, m.TopicPartition.Offset)
    }

    close(deliveryChan)
}

エラー

./producer_example.go:37:12: undefined: kafka.NewProducer
./producer_example.go:37:31: undefined: kafka.ConfigMap
./producer_example.go:48:28: undefined: kafka.Event
./producer_example.go:51:19: undefined: kafka.Message
Markus W Mahlberg:

編集する

私はビルドタグを使用して動作することを確認できますmusl

FROM golang:alpine as build
WORKDIR /go/src/app
# Set necessary environmet variables needed for our image
ENV GOOS=linux GOARCH=amd64 
COPY . .
RUN apk update && apk add gcc librdkafka-dev openssl-libs-static zlib-static zstd-libs libsasl librdkafka-static lz4-dev lz4-static zstd-static libc-dev musl-dev 
RUN go build -tags musl -ldflags '-w -extldflags "-static"' -o main

FROM scratch
COPY --from=build /go/src/app/main /
# Command to run the executable
ENTRYPOINT ["/main"]

以下に示すように、テスト設定で動作します。


OK、使用されているバージョン1.4.0はgithub.com/confluentinc/confluent-kafka-go/kafka、少なくとも現在のアルパイン3.11の状態とは概して互換性がないようです。さらに、最善を尽くしたにもかかわらず、静的にコンパイルされたバイナリをビルドできず、での使用に適していませんでしたFROM scratch

ただし、現在のバージョンのKafkaに対してコードを実行することはできました。画像は少し大きいですが、私は機能していると思いますし、少し大きい方が機能していないことよりもエレガントです。

全員

1.にダウングレード [email protected]

単純な

$ go get -u -v github.com/confluentinc/[email protected]

2. Dockerfileを変更します

そもそも、ビルドの依存関係がいくつか欠けていました。また、今後は使用しないため、ランタイム依存関係も必要になりますFROM scratch私もそれを簡素化しようとし、jwilder / dockerizeを残したことに注意してください。これは、テスト設定の時間を計る必要がないように使用しました。

FROM golang:alpine as build

# The default location is /go/src
WORKDIR /go/src/app
ENV GOOS=linux \
    GOARCH=amd64
# We simply copy everything to /go/src/app    
COPY . .
# Add the required build libraries
RUN apk update && apk add gcc librdkafka-dev zstd-libs libsasl lz4-dev libc-dev musl-dev 
# Run the build
RUN go build -o main


FROM alpine
# We use dockerize to make sure the kafka sever is up and running before the command starts.
ENV DOCKERIZE_VERSION v0.6.1
ENV KAFKA kafka
# Add dockerize
RUN apk --no-cache upgrade && apk --no-cache --virtual .get add curl \
 && curl -L -O https://github.com/jwilder/dockerize/releases/download/${DOCKERIZE_VERSION}/dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz \
 && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
 && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
 && apk del .get \
 # Add the runtime dependency.
 && apk add --no-cache librdkafka
# Fetch the binary 
COPY --from=build /go/src/app/main /
# Wait for kafka to come up, only then start /main
ENTRYPOINT ["sh","-c","/usr/local/bin/dockerize -wait tcp://${KAFKA}:9092 /main kafka test"]

3.テストする

docker-compose.yamlすべてが機能するかどうかを確認するためにを作成しました

version: "3.7"

services:
  zookeeper:
    image: 'bitnami/zookeeper:3'
    ports:
      - '2181:2181'
    volumes:
      - 'zookeeper_data:/bitnami'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: 'bitnami/kafka:2'
    ports:
      - '9092:9092'
    volumes:
      - 'kafka_data:/bitnami'
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
    depends_on:
      - zookeeper
  server:
    image: fals/kafka-main
    build: .
    command: "kafka test"
volumes:
  zookeeper_data:
  kafka_data:

セットアップが次のように機能することを確認できます。

$  docker-compose build && docker-compose up -d && docker-compose logs -f server
[...]
server_1     | 2020/04/18 18:37:33 Problem with dial: dial tcp 172.24.0.4:9092: connect: connection refused. Sleeping 1s
server_1     | 2020/04/18 18:37:34 Connected to tcp://kafka:9092
server_1     | Created Producer rdkafka#producer-1
server_1     | Delivered message to topic test [0] at offset 0
server_1     | 2020/04/18 18:37:36 Command finished successfully.
kfka_server_1 exited with code 0

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Docker for Windowsでイメージをビルドすると、gemのインストールが失敗する

分類Dev

DockerでPECLパッケージのインストールが失敗する

分類Dev

Pythonローカルパッケージの作成/インポートが失敗する(悲惨なことに)

分類Dev

Rパッケージのインストールでエラーが返されたときにDockerイメージのビルドが失敗するようにする

分類Dev

MacOSでビルドパラメータに `-gcflags" all = -N -l "`が含まれ、net / httpをインポートするとビルドが失敗する

分類Dev

golangでアーカイブ/ tarをインポートするとdocker runが失敗する

分類Dev

パッケージのインストール中にJenkinsビルドジョブが失敗する

分類Dev

SSISパッケージは、「64ビットドライバーがインストールされていない場合は、32ビットモードで実行する」というエラーで失敗します。

分類Dev

Pythonパッケージをインストールすると、「コマンド「pythonsetup.pyegg_info」が失敗しました」と表示されますか?

分類Dev

docker-composeでイメージをビルドするときに複数のDockerfileが失敗する

分類Dev

gccでコンパイルすると、Dockerビルドが失敗します

分類Dev

BowerのインストールがGitETIMEDOUTパッケージエラーと終了コード#128で失敗する

分類Dev

ローカルパッケージを使用したデプロイメントビルドが「インポートパスがホスト名で始まっていない」で失敗する

分類Dev

Golang Docker SDKイメージのビルドがCOPYで失敗する

分類Dev

パッケージのインストールに失敗するとapt-getが壊れます

分類Dev

パッケージのインストールに失敗するとapt-getが壊れます

分類Dev

DockerプラグインでJenkinsをビルドすると、インストールに失敗します

分類Dev

インポートを再配置するとコンパイルが失敗するのはなぜですか?

分類Dev

CRANRパッケージのcondaビルドが失敗する

分類Dev

Rustpkgがパッケージのビルドに失敗する

分類Dev

Dockerコンテナ内から(プライベート)gitリポジトリを使用するパッケージをインストールしようとすると失敗します

分類Dev

Spring Bootアプリケーション用のWARパッケージを生成するときにMavenビルドが失敗しますか?

分類Dev

gcloud app deployが「内部パッケージをインポートできません」に失敗する

分類Dev

azuredevopsのdockerfileタスクのdep / glideパッケージを使用して、他のリポジトリからイメージをビルドすることはできません。ホストキーの検証に失敗しましたエラー

分類Dev

パッケージをビルドするときに1つを除くパッケージのすべての機能をインポートします

分類Dev

PySpark用のPython3パッケージをバンドルすると、インポートが失われる

分類Dev

SQLジョブエージェントで実行するとSSISパッケージが失敗する

分類Dev

conda がルート パッケージをアンインストールしようとすると、conda 環境へのパッケージのインストールが失敗する

分類Dev

パッケージのインストールPycharm64ビットが失敗する

Related 関連記事

  1. 1

    Docker for Windowsでイメージをビルドすると、gemのインストールが失敗する

  2. 2

    DockerでPECLパッケージのインストールが失敗する

  3. 3

    Pythonローカルパッケージの作成/インポートが失敗する(悲惨なことに)

  4. 4

    Rパッケージのインストールでエラーが返されたときにDockerイメージのビルドが失敗するようにする

  5. 5

    MacOSでビルドパラメータに `-gcflags" all = -N -l "`が含まれ、net / httpをインポートするとビルドが失敗する

  6. 6

    golangでアーカイブ/ tarをインポートするとdocker runが失敗する

  7. 7

    パッケージのインストール中にJenkinsビルドジョブが失敗する

  8. 8

    SSISパッケージは、「64ビットドライバーがインストールされていない場合は、32ビットモードで実行する」というエラーで失敗します。

  9. 9

    Pythonパッケージをインストールすると、「コマンド「pythonsetup.pyegg_info」が失敗しました」と表示されますか?

  10. 10

    docker-composeでイメージをビルドするときに複数のDockerfileが失敗する

  11. 11

    gccでコンパイルすると、Dockerビルドが失敗します

  12. 12

    BowerのインストールがGitETIMEDOUTパッケージエラーと終了コード#128で失敗する

  13. 13

    ローカルパッケージを使用したデプロイメントビルドが「インポートパスがホスト名で始まっていない」で失敗する

  14. 14

    Golang Docker SDKイメージのビルドがCOPYで失敗する

  15. 15

    パッケージのインストールに失敗するとapt-getが壊れます

  16. 16

    パッケージのインストールに失敗するとapt-getが壊れます

  17. 17

    DockerプラグインでJenkinsをビルドすると、インストールに失敗します

  18. 18

    インポートを再配置するとコンパイルが失敗するのはなぜですか?

  19. 19

    CRANRパッケージのcondaビルドが失敗する

  20. 20

    Rustpkgがパッケージのビルドに失敗する

  21. 21

    Dockerコンテナ内から(プライベート)gitリポジトリを使用するパッケージをインストールしようとすると失敗します

  22. 22

    Spring Bootアプリケーション用のWARパッケージを生成するときにMavenビルドが失敗しますか?

  23. 23

    gcloud app deployが「内部パッケージをインポートできません」に失敗する

  24. 24

    azuredevopsのdockerfileタスクのdep / glideパッケージを使用して、他のリポジトリからイメージをビルドすることはできません。ホストキーの検証に失敗しましたエラー

  25. 25

    パッケージをビルドするときに1つを除くパッケージのすべての機能をインポートします

  26. 26

    PySpark用のPython3パッケージをバンドルすると、インポートが失われる

  27. 27

    SQLジョブエージェントで実行するとSSISパッケージが失敗する

  28. 28

    conda がルート パッケージをアンインストールしようとすると、conda 環境へのパッケージのインストールが失敗する

  29. 29

    パッケージのインストールPycharm64ビットが失敗する

ホットタグ

アーカイブ