Quarkus: Unable to build a gRPC-based Gradle project on Linux Alpine

Created on 9 Dec 2020  路  5Comments  路  Source: quarkusio/quarkus

Describe the bug
It is not possible to build a gRPC-based Gradle project on Linux Alpine

Expected behavior
It should be possible to build gRPC-based Gradle projects on Linux Alpine

Actual behavior
Build fails with an exception:

#10 52.04 > Task :quarkusGenerateCode FAILED
#10 52.04 :quarkusGenerateCode (Thread[Execution worker for ':',5,main]) completed. Took 19.126 secs.
#10 52.04 
#10 52.04 FAILURE: Build failed with an exception.
#10 52.04 
#10 52.14 * What went wrong:
#10 52.14 Execution failed for task ':quarkusGenerateCode'.
#10 52.14 > Failed to generate sources in the QuarkusPrepare task
#10 52.14 
#10 52.14 * Try:
#10 52.14 Run with --debug option to get more log output. Run with --scan to get full insights.
#10 52.14 
#10 52.14 * Exception is:
#10 52.14 org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':quarkusGenerateCode'.
#10 52.14   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
#10 52.14   at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
#10 52.14   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
#10 52.14   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
#10 52.14   at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
#10 52.15   at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
#10 52.15   at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
#10 52.15   at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
#10 52.15   at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
#10 52.15   at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
#10 52.15   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
#10 52.15   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
#10 52.15   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
#10 52.15   at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
#10 52.15   at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
#10 52.15   at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
#10 52.15   at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
#10 52.15   at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
#10 52.15   at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
#10 52.16   at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
#10 52.16   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
#10 52.16   at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
#10 52.16   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
#10 52.16   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
#10 52.16   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
#10 52.16   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
#10 52.16   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
#10 52.16   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
#10 52.16   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
#10 52.16   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
#10 52.16   at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
#10 52.16   at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
#10 52.16   at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
#10 52.16 Caused by: org.gradle.api.GradleException: Failed to generate sources in the QuarkusPrepare task
#10 52.17   at io.quarkus.gradle.tasks.QuarkusGenerateCode.prepareQuarkus(QuarkusGenerateCode.java:99)
#10 52.17   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
#10 52.17   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
#10 52.17   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
#10 52.17   at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
#10 52.17   at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
#10 52.17   at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
#10 52.17   at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
#10 52.17   at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
#10 52.18   at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
#10 52.18   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
#10 52.18   at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
#10 52.18   at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
#10 52.18   at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
#10 52.18   at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
#10 52.18   at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
#10 52.18   at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
#10 52.18   at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
#10 52.18   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
#10 52.18   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
#10 52.18   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
#10 52.18   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
#10 52.18   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
#10 52.18   at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
#10 52.18   at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
#10 52.18   at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
#10 52.18   at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
#10 52.18   at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
#10 52.18   at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
#10 52.18   at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
#10 52.18   at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
#10 52.18   at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
#10 52.18   at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
#10 52.18   at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
#10 52.18   at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
#10 52.18   at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
#10 52.18   at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
#10 52.18   at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
#10 52.18   at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
#10 52.18   at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
#10 52.18   at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
#10 52.18   at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
#10 52.18   at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
#10 52.18   at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
#10 52.18   at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
#10 52.18   at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
#10 52.18   at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
#10 52.18   at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
#10 52.18   at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
#10 52.18   at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
#10 52.18   at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
#10 52.18   at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
#10 52.18   at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
#10 52.18   at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
#10 52.18   at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
#10 52.18   at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
#10 52.18   at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
#10 52.19   at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
#10 52.19   at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
#10 52.19   at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
#10 52.19   at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
#10 52.19   at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
#10 52.19   at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
#10 52.19   at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
#10 52.19   at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
#10 52.19   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
#10 52.19   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
#10 52.19   at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
#10 52.19   at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
#10 52.19   at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
#10 52.19   at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
#10 52.19   at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
#10 52.19   at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
#10 52.19   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
#10 52.19   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
#10 52.19   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
#10 52.19   at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
#10 52.19   at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
#10 52.19   at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
#10 52.19   at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
#10 52.20   at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
#10 52.20   at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
#10 52.20   at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
#10 52.20   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
#10 52.20   at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
#10 52.20   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
#10 52.20   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
#10 52.20   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
#10 52.20   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
#10 52.20   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
#10 52.20   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
#10 52.20   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
#10 52.20   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
#10 52.20   at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
#10 52.20   at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
#10 52.20   at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
#10 52.20 Caused by: java.lang.reflect.InvocationTargetException
#10 52.20   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
#10 52.20   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
#10 52.20   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
#10 52.20   at io.quarkus.gradle.tasks.QuarkusGenerateCode.prepareQuarkus(QuarkusGenerateCode.java:89)
#10 52.20   ... 95 more
#10 52.20 Caused by: io.quarkus.bootstrap.prebuild.CodeGenException: Failed to generate java files from proto file in /src/main/proto
#10 52.21   at io.quarkus.grpc.deployment.GrpcCodeGen.trigger(GrpcCodeGen.java:116)
#10 52.21   at io.quarkus.deployment.CodeGenerator.lambda$trigger$1(CodeGenerator.java:91)
#10 52.21   at io.quarkus.deployment.CodeGenerator.callWithClassloader(CodeGenerator.java:67)
#10 52.21   at io.quarkus.deployment.CodeGenerator.trigger(CodeGenerator.java:87)
#10 52.21   at io.quarkus.deployment.CodeGenerator.initAndRun(CodeGenerator.java:31)
#10 52.21   ... 99 more
#10 52.21 Caused by: java.io.IOException: Cannot run program "/build/com.google.protobuf-protoc-linux-x86_64-exe": error=2, No such file or directory
#10 52.21   at io.quarkus.deployment.util.ProcessUtil.launchProcess(ProcessUtil.java:38)
#10 52.21   at io.quarkus.grpc.deployment.GrpcCodeGen.trigger(GrpcCodeGen.java:106)
#10 52.21   ... 103 more
#10 52.21 Caused by: java.io.IOException: error=2, No such file or directory
#10 52.21   ... 105 more

To Reproduce

A repository with the bug: https://github.com/shpota/quarkus-grpc-alpine-issue

Steps to reproduce the behavior:

  1. Generate a Quarkus Gradle project with io.quarkus:quarkus-grpc dependency.
  2. Add a valid .proto file to src/main/proto
  3. Execute ./gradlew --stacktrace build on an Alpine Linux environment.

Alternativelly:

  1. Clone the reporistory: https://github.com/shpota/quarkus-grpc-alpine-issue (it has a valid Dockerfile reproducing the issue)
  2. Run docker build .

Configuration
not applicable

Screenshots
not applicable

Environment (please complete the following information):

  • Output of uname -a or ver: Linux buildkitsandbox 5.4.39-linuxkit #1 SMP Fri May 8 23:03:06 UTC 2020 x86_64 Linux
  • Output of java -version: openjdk 15-ea 2020-09-15
  • GraalVM version (if different from Java): -
  • Quarkus version or git rev: 1.10.3.Final
  • Build tool (ie. output of mvnw --version or gradlew --version):
Gradle 6.5.1

Build time:   2020-06-30 06:32:47 UTC
Revision:     66bc713f7169626a7f0134bf452abde51550ea0a

Kotlin:       1.3.72
Groovy:       2.5.11
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          15-ea (Oracle Corporation 15-ea+31)
OS:           Linux 5.4.39-linuxkit amd64

Additional context
The build works well on a Debian-based distribution (eg. openjdk:15.0.1-jdk-slim), however it is important to be able to build it on a minimal distributions like Alpine because they reduce costs and build time when used in CI.

aregradle aregrpc arekotlin kinbug

Most helpful comment

@michalszynkiewicz thank you. Installing glibc helped.

For those who don't want to use a Debian-based image you can add the following instruction to your Dockerfile in order to work around the issue.

RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
    && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk \
    && apk add glibc-2.32-r0.apk && rm glibc-2.32-r0.apk

All 5 comments

/cc @cescoffier, @evanchooly, @glefloch, @michalszynkiewicz, @quarkusio/devtools

It looks like the problem is not related to quarkus but to alpine. There is a similar issue in the protobuf-java repository: https://github.com/google/protobuf-gradle-plugin/issues/265

However, maybe we could add an option to allow specifying the protoc binary to use ? @cescoffier, @michalszynkiewicz WDYT ?

It would be a nice feature. WDYT @michalszynkiewicz ?

:+1: to adding an option to specify protoc's path.

The issue @glefloch linked says that installing glibc is an option to work around the problem.
@Shpota could you check if adding it makes it work for you?

Thanks for the report :)

@michalszynkiewicz thank you. Installing glibc helped.

For those who don't want to use a Debian-based image you can add the following instruction to your Dockerfile in order to work around the issue.

RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
    && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk \
    && apk add glibc-2.32-r0.apk && rm glibc-2.32-r0.apk
Was this page helpful?
0 / 5 - 0 ratings