dockerfile使用

目前需要创建docker容器 之前用的是基于 Java环境的镜像 构件的,当前开发都后期需要gdal和其他的环境,仅仅基于java的 命令是远远不够用户的

首先gdal 官方提供了源,但是这个源没有java环境需要我们安装,他提供了多个Linux发行版本 包括Ubuntu和alpine ,起初基于Ubuntu small来搭建的

1
2
3
4
5
6
7
8
9
10
FROM osgeo/gdal:ubuntu-small-3.2.1
MAINTAINER gdallikedemo
RUN add-apt-repository ppa:openjdk-r/ppa && \
apt-get update && \
apt-get install -y java-1.8.0-openjdk && \
apt-get clean;
COPY MY_JAR.jar /home/MY_JAR.jar
# RUN nohup java -jar /home/MY_JAR.jar >/dev/null 2>&1 &
CMD ["java","-jar","/home/MY_JAR.jar"]

,但是在添加源的时候又依赖于命令 add-resportiy 添加源,如果用 Ubuntu-full后可以看到文件明显增大到1g,明显不符合要求,我就换了alpine ,看网上介绍路由器和小型设备的,看了后就在这个版本上添加

1
2
3
4
5
6
7
8
9
10
11
12
FROM osgeo/gdal:alpine-normal-3.2.0
MAINTAINER gdallikedemo
# 添加命令 安装java
RUN apk add --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community && \
apk add openjdk8 ;
# 声明端口
EXPOSE 11003
# 复制指定文件
COPY MY_JAR.jar /home/MY_JAR.jar
# RUN nohup java -jar /home/MY_JAR.jar >/dev/null 2>&1 &
CMD ["java","-jar","/home/MY_JAR.jar"]

如果需要后面的服务也可以

参考该要求分层存储

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。

一定要注一个实现 不要多次run,尽量集合在一起执行