赞
踩
今天遇到问题, 项目上传了一个GEO文件,但是在容器里运行的时候,找不到路径,因为容器里没有项目文件路径,只有一个JAR包, 这样的话,就要在容器里创建一个工作目录,然后打包容器的时候,把文件copy或者 add进容器里,
代码如下
1 第一步,docker 文件
createDockerFile.sh 在服务端直接用命令 。 sh createDockerFile.sh ,拉代码和打包镜像,
在使用 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/创建容器的工作目录,这样每次启动容器,必须要挂载,有时间再尝试吧,我在脚本里解决了,就比较省事
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。