docker构建镜像命令

编写dockerfile文件

例子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 用于指定基础镜像,后续的指令都基于这个基础镜像进行构建。
 From 镜像名称
# 基于 oraclelinux:7-slim 来构建新的镜像
FROM oraclelinux:7-slim

#或者基于openjdk:11来构建
FROM openjdk:11

  • ENV命令,在 Dockerfile 中,ENV 命令用于设置环境变量。这些环境变量可以在后续的构建步骤(即后续的 RUN 命令)以及容器运行时中使用。在使用的时候 可以使用 $符 加变量名称
#ENV 命令的基本语法如下:
ENV >=> ...



  • RUN命令,用来执行在linux中的命令,比如赋权,或者安装命令,下载之类的
# 例如给文件夹增加下的文件增加读写权限
RUN chmod -R 777  /root/pdf
#下载文件的命令
RUN yum install -y java-1.8.0-openjdk-devel.x86_64
# 换行符 和 \
可以使用换行符  和 \  来跨行编写命令
# &&  符号,表示必须 && 前的命令执行成功后才会执行后面的命令,如果前面失败了后面不会执行
  • COPY,表示复制
# copy 宿主机文件路径  镜像内路径
# 复制文件
COPY sqlhc.sh /root/shell/ 
COPY asmChart.jasper /root/pdf/ 

  • ADD,在 Dockerfile 中,ADD 命令用于将本地文件、目录或远程文件 URL 添加到镜像的文件系统中。ADD 命令非常强大,因为它可以自动解压归档文件(如 tar、gzip、bzip2 等)到镜像中。
# 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 定义可以在构建时传递的变量
#使用ARG命令 定义一个名为 APP_BIN变量
ARG APP_BIN=/usr/share/nginx/html
# 将当前目录下,bin目录下的文件 复制到 APP_BIN变量所代表的路径下
COPY bin/ $APP_BIN

ARG和ENV命令在Dockerfile中各自扮演着不同的角色,它们的主要差别如下:

  1. 定义阶段和存在时间:
    ARG命令主要用于在构建镜像的过程中设置一个构建时的环境变量。这些变量在构建过程中可以被使用,并且可以在Dockerfile中通过引用它们的名称来访问。然而,一旦镜像编译成功,ARG指定的变量将不再存在。
    ENV命令则用于在容器运行时设置环境变量。这些变量在容器启动时被设置,并且可以在容器中的应用程序中使用。与ARG不同,ENV设置的环境变量在镜像构建完成后会保留在镜像中,因此当使用构建后的镜像运行容器时,这些环境变量仍然保持不变。
  2. 使用方式和语法:
    ARG命令的格式为ARG [=]。在执行docker build时,可以通过–build-arg <参数名>=<值>来为声明的变量赋值。此外,ARG还可以引用Docker内置的一些镜像创建变量,这些变量无需用户声明即可直接使用。
    ENV命令的语法允许直接设置一个或多个环境变量,如ENV MY_NAME=“John Doe” MY_DOG=Rex。它支持在指令中设置多个环境变量,并且环境变量的值可以被其他环境变量引用。
  3. 功能和用途:
    ARG主要用于在构建过程中传递参数或设置构建时的环境,但这些变量并不会被保留到最终的镜像中。它们主要在Dockerfile的构建阶段提供灵活性和可配置性。
    ENV则更关注于容器运行时的环境配置。通过设置环境变量,它可以影响容器内部应用程序的行为或配置。
    总结来说,ARG和ENV在Dockerfile中各有其特定的使用场景和功能。ARG主要用于构建时的参数传递和环境设置,而ENV则关注于容器运行时的环境配置。在构建Docker镜像时,应根据具体需求选择使用合适的命令。
  • EXPOSE,暴露端口,EXPOSE 命令在 Dockerfile 中用于声明容器在运行时应该监听的端口。这个命令并不实际地映射或公开任何端口到宿主机,而是作为一个元数据,告诉 Docker 容器哪些网络端口会被应用程序使用。
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 命令,配置容器启动时运行的命令。与 CMD 类似,但 ENTRYPOINT 的命令不会被 docker run 命令行参数指定的指令所覆盖,而是将这些参数当作参数传给 ENTRYPOINT 指定的命令。

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 也是另一个参数。每个参数都作为一个独立的数组元素。

你可能感兴趣的:(docker,docker,容器,运维)