如何在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
相关产品推荐
相关产品推荐

