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 <key>=<value> ...



  • 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 <src> <dest>
# <src>:要添加的源文件或目录的路径,或者远程文件的 URL。
# <dest>:目标路径在 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 也是另一个参数。每个参数都作为一个独立的数组元素。

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以回答这个问题。Docker 是一种容器化技术,可以将应用程序及其依赖项打包成一个可移植的容器,方便在不同的环境中部署和运行。构建 Docker 镜像可以使用 Dockerfile 文件来定义镜像构建过程,推送镜像可以使用 Docker Hub 或其他镜像仓库来存储和分享镜像。 ### 回答2: Docker是一种开源的容器化平台,能够帮助开发人员和运维人员更高效地构建、打包、分发和运行应用程序。Docker的核心概念是镜像(Image)和容器(Container)。 首先,构建镜像是指将一个应用程序的代码、依赖项以及配置文件等打包成一个可执行的镜像文件。在构建镜像之前,我们需要编写一个Dockerfile,其中包含了构建镜像所需的步骤和指令。Dockerfile可以指定基础镜像、安装软件、配置环境变量等内容。通过执行docker build命令Docker会根据Dockerfile的指令来逐步构建镜像,并生成一个唯一的镜像标识符。 接下来,推送镜像是将构建好的镜像上传到Docker镜像仓库中,以便其他人或其他机器可以下载和使用这个镜像Docker镜像仓库是一个集中存储和管理镜像的地方,可以方便地共享和分发镜像。推送镜像之前,我们需要先登录到镜像仓库,然后使用docker push命令将本地镜像推送到指定的仓库地址和版本号。 通过Docker构建镜像并推送到镜像仓库,可以带来一些好处。首先,镜像可以快速部署和启动,减少了应用程序的依赖和配置问题。其次,镜像具有良好的可重复性,可以在不同的环境中使用相同的镜像来保持一致性。此外,镜像可以方便地进行版本控制和更新,而且可以在不同的主机上快速部署相同的应用程序。 总体而言,Docker构建镜像和推送镜像Docker平台的核心功能之一,可以帮助开发人员和运维人员更加高效地管理和分发应用程序。通过合理地使用Docker构建和推送镜像,可以提高开发效率、降低部署成本,并且可以方便地进行版本控制和更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值