You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dockerfile中配置gbak解决Java API依赖报错问题

问题:Docker容器中运行依赖gbak的Java API失败

问题背景

我有一个Java API需要依赖gbak工具才能正常工作,调用gbak的核心代码如下:

String command = "gbak -b -v -g -user " + username + " -password " + password + " " + databasePath + " " + backupPathUpdated;

ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();

process.waitFor();

初始Dockerfile

我编写的初始Dockerfile如下:

# Use an official OpenJDK runtime as a parent image
FROM openjdk:17-alpine

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Make port 8080 available to the world outside this container
EXPOSE 8080

# Run application when the container launches
CMD ["java", "-jar", "target/poc-docker-0.0.1-SNAPSHOT.jar"]

运行容器时的错误

运行镜像时出现找不到gbak的错误:

Java.io.IOException: Cannot run program "gbak": error=2, No such file or directory
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1142)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073)
    at xxxxxxxxxxxxxxxxxxxxxxxxxxxx.BackupSchedulerService.getBackup(BackupSchedulerService.java:52)
    at xxxxxxxxxxxxxxxxxxxxxxxxxxxx.BackupSchedulerService.lambda$executeBackup$0(BackupSchedulerService.java:35)
    at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:313)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:244)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1109)
    ... 4 more

尝试安装Firebird失败

我尝试在Dockerfile中添加安装Firebird的步骤(gbak是Firebird的备份工具),修改后的Dockerfile:

# Use an official OpenJDK runtime as a parent image
FROM openjdk:17-alpine

# Set the working directory to /app
WORKDIR /app

# Install gbak
RUN apk --no-cache add firebird

# Copy the current directory contents into the container at /app
COPY . /app

# Make port 8080 available to the world outside this container
EXPOSE 8080

# Run application when the container launches
CMD ["java", "-jar", "target/poc-docker-0.0.1-SNAPSHOT.jar"]

但构建镜像时失败,错误信息:

=> ERROR [3/4] RUN apk --no-cache add firebird                                                                                                          1.3s 
   8 | >>> RUN apk --no-cache add firebird
   9 |
  10 |     # Copy the current directory contents into the container at /app

解决方法

我通过以下步骤修改Dockerfile解决了问题:

RUN apk --no-cache add wget tar procps xz make build-base \
&& wget Firebird-4.0.4.3010-0.i686.tar.gz \
&& tar -xzf Firebird-4.0.4.3010-0.i686.tar.gz \
&& cd Firebird-4.0.4.3010-0.i686 \
&& wget ltm-1.2.0.tar.xz \
&& tar -xJf ltm-1.2.0.tar.xz \
&& cd libtommath-1.2.0 \
&& make \
&& make install \
&& cd ../ \
&& apk del wget tar xz make build-base \
&& rm -rf /var/cache/apk/*

步骤说明:

  • 先安装编译所需的依赖工具:wget、tar、procps、xz、make、build-base
  • 下载Firebird 4.0.4的源码包和libtommath 1.2.0的源码包
  • 解压并编译安装libtommath
  • 清理安装过程中用到的依赖工具和缓存文件,减小镜像体积

内容的提问来源于stack exchange,提问作者lari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:40:29