当前位置:   article > 正文

docker下读取txt文件找不到路径,必须copy到容器或者映射文件_docker运行c++时找不到.txt

docker运行c++时找不到.txt

  今天遇到问题, 项目上传了一个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进打包目录下

  1. cd ..
  2. git reset --hard
  3. git pull
  4. mvn clean
  5. mvn install
  6. cp target/distributed_traffic_client.jar docker/
  7. cp target/classes/GeoLite2-City.mmdb docker/
  8. cd docker
  9. docker build -t distributed_traffic_client:v1 .

Dockerfile

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

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

 

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

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

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

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

/app/GeoLite2-City.mmdb

最后成功找到文件, 

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号