例子1;
FROM oraclelinux:7-slim
ENV release=19
ENV update=13
RUN curl -o /etc/yum.repos.d/public-yum-ol7.repo https://yum.oracle.com/public-yum-ol7.repo && \
yum-config-manager --enable ol7_oracle_instantclient && \
yum install -y java-1.8.0-openjdk-devel.x86_64 && \
yum -y install oracle-instantclient${release}.${update}-basic oracle-instantclient${release}.${update}-devel oracle-instantclient${release}.${update}-sqlplus && \
rm -rf /var/cache/yum && \
echo /usr/lib/oracle/${release}.${update}/client64/lib > /etc/ld.so.conf.d/oracle-instantclient${release}.${update}.conf && \
ldconfig
#install sqlhc
RUN mkdir -p /root/shell
COPY sqlhc.sh /root/shell/
COPY sqlhc.sql /root/shell/
RUN chmod +x /root/shell/sqlhc.sh
#PDF
RUN mkdir -p /root/pdf
COPY asmChart.jasper /root/pdf/
COPY asmInfo.jasper /root/pdf/
COPY dataBaseTableSpaceInfo.jasper /root/pdf/
COPY indexUseAs.jasper /root/pdf/
COPY main.jasper /root/pdf/
COPY objectFragmentsInfo.jasper /root/pdf/
COPY topObjectInfo.jasper /root/pdf/
COPY dbSpaceChart.jasper /root/pdf/
RUN chmod -R 777 /root/pdf
#install java deployment envirement
ENV JAVA_BASE=/usr/java
RUN mkdir -p $JAVA_BASE
ADD jre-8u331-linux-x64.tar.gz $JAVA_BASE
#RUN chown -R root:root $JAVA_BASE/jre1.8.0_331
RUN ln -s $JAVA_BASE/jre1.8.0_331 $JAVA_BASE/jdk-8
ENV JAVA_HOME=$JAVA_BASE/jdk-8
#timezone setting
ENV TimeZone=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
ENV PATH=$PATH:/usr/lib/oracle/${release}.${update}/client64/bin:$JAVA_HOME/bin
命令解读
From 镜像名称
# 基于 oraclelinux:7-slim 来构建新的镜像
FROM oraclelinux:7-slim
#或者基于openjdk:11来构建
FROM openjdk:11
#ENV 命令的基本语法如下:
ENV >=> ...
# 例如给文件夹增加下的文件增加读写权限
RUN chmod -R 777 /root/pdf
#下载文件的命令
RUN yum install -y java-1.8.0-openjdk-devel.x86_64
# 换行符 和 \
可以使用换行符 和 \ 来跨行编写命令
# && 符号,表示必须 && 前的命令执行成功后才会执行后面的命令,如果前面失败了后面不会执行
# copy 宿主机文件路径 镜像内路径
# 复制文件
COPY sqlhc.sh /root/shell/
COPY asmChart.jasper /root/pdf/
# ADD
# :要添加的源文件或目录的路径,或者远程文件的 URL。
# :目标路径在 Docker 镜像中的位置
# 将tar包,复制并解压到 $JAVA_BASE这个所代表的路径中
ADD jre-8u331-linux-x64.tar.gz $JAVA_BASE
# 将当前上下文中的 myfile.txt 文件添加到镜像的 /app/ 目录下:
ADD myfile.txt /app/
#将当前上下文中的 mydir/ 目录(包括其内容)添加到镜像的 /app/ 目录下
ADD mydir/ /app/
#从远程 URL 添加一个文件到镜像中:
ADD https://example.com/myfile.txt /app/
例子2
FROM nginx:1.23
ARG APP_BIN=/usr/share/nginx/html
COPY default.conf /etc/nginx/conf.d/
COPY bin/ $APP_BIN
EXPOSE 80
#使用ARG命令 定义一个名为 APP_BIN变量
ARG APP_BIN=/usr/share/nginx/html
# 将当前目录下,bin目录下的文件 复制到 APP_BIN变量所代表的路径下
COPY bin/ $APP_BIN
ARG和ENV命令在Dockerfile中各自扮演着不同的角色,它们的主要差别如下:
EXPOSE 80
例子三
基于jdk11镜像构建新的镜像
FROM openjdk:11
COPY 5gSports-app.jar /
COPY ./hikliblinux64 /lib/hik/hikliblinux64
ENTRYPOINT ["java","-jar","/5gSports-app.jar","--spring.config.location=classpath:/product.yml"]
ENTRYPOINT 指令应该是一个 JSON 数组,其中每个元素都是一个独立的字符串,而不是一个包含整个命令和参数的单一字符串。
正确的方式是将命令和每个参数分开成数组中的不同元素
ENTRYPOINT ["java","-jar","/5gSports-app.jar","--spring.config.location=classpath:/product.yml"]
这样,java 是命令,-jar 和 5gSports-app.jar 是传递给 java 命令的参数,–spring.config.location=classpath:/product.yml 也是另一个参数。每个参数都作为一个独立的数组元素。