docker下读取txt文件找不到路径,必须copy到容器或者映射文件
今天遇到问题, 项目上传了一个GEO文件,但是在容器里运行的时候,找不到路径,因为容器里没有项目文件路径,只有一个JAR包, 这样的话,就要在容器里创建一个工作目录,然后打包容器的时候,把文件copy或者 add进容器里,代码如下1 第一步,docker 文件createDockerFile.sh 在服务端直接用命令 。 shcreateDockerFile.sh ,拉代码和打...
今天遇到问题, 项目上传了一个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/创建容器的工作目录,这样每次启动容器,必须要挂载,有时间再尝试吧,我在脚本里解决了,就比较省事
更多推荐
所有评论(0)