今天遇到问题, 项目上传了一个GEO文件,但是在容器里运行的时候,找不到路径,因为容器里没有项目文件路径,只有一个JAR包,  这样的话,就要在容器里创建一个工作目录,然后打包容器的时候,把文件copy或者 add进容器里,

代码如下

1 第一步,docker 文件

createDockerFile.sh 在服务端直接用命令 。 sh createDockerFile.sh ,拉代码和打包镜像,

Build 上下文的概念

在使用 docker build 命令通过 Dockerfile 创建镜像时,会产生一个 build 上下文(context)。所谓的 build 上下文就是 docker build 命令的 PATH 或 URL 指定的路径中的文件的集合。在镜像 build 过程中可以引用上下文中的任何文件,比如我们要介绍的 COPY 和 ADD 命令,就可以引用上下文中的文件。

默认情况下 docker build -t testx . 命令中的 . 表示 build 上下文为当前目录。当然我们可以指定一个目录作为上下文,比如下面的命令:

$ docker build -t testx /home/geoip/lmc

所以, 当前目录没有这个文件,然后我copy进打包目录下

cd ..
git reset --hard 
git pull
mvn clean
mvn install
cp target/distributed_traffic_client.jar docker/
cp target/classes/GeoLite2-City.mmdb docker/
cd docker 
docker build -t distributed_traffic_client:v1 .

Dockerfile

这里就是打包镜像命令 ,这里要把打包命令的文件  ADD进 容器里, 但是copy命令不管用,创建相应的工作目录

FROM java:8-alpine
MAINTAINER linjack.li linjack.li@zenlayer.com
VOLUME /tmp
RUN mkdir /app
ADD distributed_traffic_client.jar /app/app.jar
WORKDIR /app
ADD GeoLite2-City.mmdb /app/
EXPOSE 9093
ENTRYPOINT ["java","-jar","/app/app.jar"]

 

第二  JAVA代码 ,因为本地和容器运行环境不一样,导致服务器上文件找不到,最后修改目录,

System.getProperty("user.dir")  就是绝对路径,不需要修改名称,

    public static File getFileGeo() {
        // 容器里运行的时候,找不到文件路径  本地运行注释放开
        // File database = new File(Thread.currentThread().getContextClassLoader().getResource("GeoLite2-City.mmdb").getPath());
        File database = new File(System.getProperty("user.dir") + "/GeoLite2-City.mmdb");
        return database;
    }

容器里的目录就像这样,能够找到文件

/app/GeoLite2-City.mmdb

最后成功找到文件, 

第二种, 挂载文件的话, 应该也是可以的, 直接挂载到app/创建容器的工作目录,这样每次启动容器,必须要挂载,有时间再尝试吧,我在脚本里解决了,就比较省事

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐