DockerFile构建过程解析 (docker是干什么的)

教程大全 2025-07-14 23:54:03 浏览

dockerFile构建过程解析

2023-06-08 07:37:42Dockerfile通过编写文件直接构建镜像,在文件中编写需要安装的命令即可。

1、概述

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

在Docker 常用命令篇中,我们已经知道了2中构建镜像的方式 export\import 和 commit方式。这两种方式都需要先运行并创建容器,然后在容器中安装vim、ifconfig等命令,然后再重新构建加强版的镜像,比较麻烦。Dockerfile通过编写文件直接构建镜像,在文件中编写需要安装的命令即可。

官网:Dockerfile reference | Docker Documentation

2、构建步骤

3、构建解析过程

(1)Dockerfile内容基础知识

(2)Docker执行Dockerfile的大致流程

4、常用指令详解

(1)咱们先看下tomcat8 的Dockerfile 文件内容

# 继承至eclipse-temurin:8-jdk-focalFROM eclipse-temurin:8-jdk-focal# 设置环境变量ENV CATALINA_HOME /usr/local/tomcatENV PATH $CATALINA_HOME/bin:$PATHRUN mkdir -p "$CATALINA_HOME"# 设置工作目录WORKDIR $CATALINA_HOME# let "Tomcat Native" live somewhere isolatedENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-libENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR# seesee also "versions.sh" (GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 5C3C5F3E314C866292F359A8F3AD5C94A67F707E 765908099ACF92702C7D949BFA0C35EA8AA299F1 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23ENV TOMCAT_MAJOR 8ENV TOMCAT_VERSION 8.5.84ENV TOMCAT_SHA512 e595e906d62ff16545318108478aa101103181569dc6f4549dd0cdf8744147f7e9ba8a88cab6d33237b22981acb1085de86e7b2a4f1659efdbd4804df1303561# 执行相关指令RUN set -eux; \\savedAptMark="$(apt-mark showmanual)"; \apt-get update; \apt-get install -y --no-install-recommends \ca-certificates \curl \dirmngr \gnupg \; \\ddist() { \local f="$1"; shift; \local distFile="$1"; shift; \local mvnFile="${1:-}"; \local success=; \local distUrl=; \for distUrl in \#"https://www.apache.org/dyn/closer.cgi?action=download&filename=$distFile" \# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/"https://downloads.apache.org/$distFile" \"https://www-us.apache.org/dist/$distFile" \"https://www.apache.org/dist/$distFile" \"https://archive.apache.org/dist/$distFile" \# if all else fails, let's try Maven (https://mvnrepository.com/artifact/org.apache.tomcat/tomcat;${mvnFile:+"https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/$mvnFile"} \; do \if curl -fL -o "$f" "$distUrl" && [ -s "$f" ]; then \success=1; \break; \fi; \done; \[ -n "$success" ]; \}; \\ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz"; \echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz.asc"; \export GNUPGHOME="$(mktemp -d)"; \for key in $GPG_KEYS; do \gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \done; \gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \tar -xf tomcat.tar.gz --strip-components=1; \rm bin/*.bat; \rm tomcat.tar.gz*; \Command -v gpgconf && gpgconf --kill all || :; \rm -rf "$GNUPGHOME"; \\#webapps webapps.dist; \mkdir webapps; \# we don't delete them completely because they're frankly a pain to get back for users who do want them, and they're generally tiny (~7MB)\nativeBuildDir="$(mktemp -d)"; \tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \apt-get install -y --no-install-recommends \dpkg-dev \gcc \libapr1-dev \libssl-dev \make \; \( \export CATALINA_HOME="$PWD"; \cd "$nativeBuildDir/native"; \gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \aprConfig="$(command -v apr-1-config)"; \./configure \--build="$gnuArch" \--libdir="$TOMCAT_NATIVE_LIBDIR" \--prefix="$CATALINA_HOME" \--with-apr="$aprConfig" \--with-java-home="$JAVA_HOME" \--with-ssl \; \nproc="$(nproc)"; \make -j "$nproc"; \make install; \); \rm -rf "$nativeBuildDir"; \rm bin/tomcat-native.tar.gz; \\# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependenciesapt-mark auto '.*' > /dev/null; \[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \| awk '/=>/ { print $(NF-1) }' \| xargs -rt readlink -e \| sort -u \| xargs -rt dpkg-query --Search \| cut -d: -f1 \| sort -u \| tee "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt" \| xargs -r apt-mark manual \; \\apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \rm -rf /var/lib/apt/lists/*; \\# sh removes env vars it doesn't support (ones with periods)#./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \\# fix permissions (especially for running as non-root)#-R +rX .; \chmod 777 logs temp work; \\# smoke testcatalina.sh version# verify Tomcat Native is working properlyRUN set -eux; \nativeLines="$(catalina.sh configtest 2>&1)"; \nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \nativeLines="$(echo "$nativeLines" | sort -u)"; \if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \echo >&2 "$nativeLines"; \exit 1; \fi# 暴露端口EXPOSE 8080# 执行命令 就是 执行 catalina.sh 启动tomcatCMD ["catalina.sh", "run"]

(2)常用指令作用说明

指令

说明

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM

MAINTAINER

镜像维护者的姓名和邮箱地址

是干什么的

容器构建时需要运行的命令,运行shell格式和exec格式 命令,RUN是在 docker build时运行

当前容器对外暴露出的端口

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

用来在构建镜像过程中设置环境变量

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

两种方式 1:COPY src dest 2:COPY [“src”, “dest”]

src:宿主机文件或者目录

desc:容器内目录

容器数据卷,用于数据保存和持久化工作

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

CMD是在docker run 时运行。

类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

命令格式:ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,

他两个组合会变成 案例如下:

假设已通过 Dockerfile 构建了 nginx:test 镜像:是否传参按照dockerfile编写执行传参运行Docker命令docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf衍生出的实际命令nginx -c/etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

优点:在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。

缺点:如果 Dockerfile 中存在多个 ENTRYPOINT 指令,仅最后一个生效。


docker commit和docker file的区别

制作镜像的方式主要有两种:通过docker commit 制作镜像通过docker build 制作镜像这两种方式都是通过改进已有的镜像来达到自己的目的。 制作基础镜像,会在另外一篇文章“从零开始制作基础镜像”中介绍。 docker commitdocker commit 是往版本控制系统里提交一次变更。 使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。 最后再将改动提交到版本系统中。 选择基础镜像基础镜像的选择要结合自己的需求。 可以选择已有的应用镜像来改造,也可以选择Ubuntu,Debian,OpenSuse这类基础系统镜像我们以ubuntu为例子来说明步骤1:运行ubuntu 镜像docker run -i -t ubuntu /bin/bash步骤2:安装软件并修改软件配置, 比如:安装apache2apt-get -yqq updateapt-get -y install apache2安装完成后,对apache2进行配置和修改步骤3:退出docker并保存镜像使用“exit”命令退出容器运行docker comit 命令, 进行保存docker commit ae46 own-apache2docker commit 命令参数说明命令格式docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]OPTIONS:-a, --author=提交的镜像作者-c, --change=[]Apply Dockerfile instruction to the created image, 没用过-m, --message= 提交时的说明文字-p, --pause=true在commit时,将container 暂停CONTAINER:可以使用container 的名字或者IDREPOSITORY指定镜像仓库,上述例子中,指定的是本地存储可以指定远程镜像仓库,如docker hub。 也可自建仓库来存放imageTAG:镜像TAGdocker build使用docker build创建镜像需要编写Dockerfile.步骤:编写自己的Dcokerfile运行docker build 命令打包镜像仍然以apache打包为例子。 以下是Dockerfile的例子FROM ubuntu:latestMAINTAINER sky#Add 163 mirror for aptADD /etc/apt/ /root/ DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apaches init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/ APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find $APACHE_CONFDIR -type f -exec sed -ri \s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \ {} ;EXPOSE 80CMD [apache2, -DFOREGROUND]编辑完成后,在与Dockerfile同一目录下运行docker build 命令docker build -t apache-img .如果没有命令出错,docker build会持续运行直到镜像创建完成而创建的过程本质上是运行一个镜像,然后在镜像中按序执行在Dockerfile中的命令,直到执行结束。 如果中间有命令执行失败,镜像创建会停止。 这时就需要看log,并修改Dockerfile,然后再次执行docker build注:两种镜像创建方式的对比:docker commitdocker build难度相对容易,适合新手和对Linux不熟悉的用户相对难,要求有一定的linux和脚本基础知识文档化文档化在通过其他文件来实现Dockerfile本身就是比较好的文档,可读和可理解性比较强。 也可配合其他文档带来详细说明升级,维护后续升级和维护麻烦,需要再次运行镜像并对内部软件进行升级或者安装新软件增加特性后续升级和维护会相对简单,可以直接在dockerfile中更改并增加新特性具体选择哪种方式来制作镜像需要结合实际情况来选择Dockerfile 关键字详解FROMFROM用来指定基础包。 在上面的例子中,基础包用的是ubuntu。 MAINTAINER镜像作者信息,或者维护人员信息ADD将文件拷贝到Container内文件系统对应的路径格式 ADD 所有拷贝到Container中的文件和文件夹权限为0755,uid和gid为0如果需要修改owner用户或者权限,需要使用RUN进行修改ADD文件,文件路径要在docker build中指定的下RUN创建镜像时执行ENV用来设置环境变量EXPOSEContainer内部服务开启的端口主机上如果要使用,还需要在启动Container时,做host-container的商品映射使用EXPOSE后,一些自动化布署工具可以直接读取这个信息,自动进行端口映射EXPOSE可以有多条,指定多个端口WORKDIR切换工作目录,可进行多次切换(相当于cd命令)切换目录对RUN,CMD,ENTRYPOINT有效USER执行container的用户,如未指定,则默认使用root用户ENTRYPOINTContainer启动时执行的命令,一个Dockerfile中只能有一条ENTRYPOINTENTRYPOINT没有CMD的可替换特性CMDContainer 启动时执行的命令,一个Dockerfile 中只能有一条CMD命令,如果有多条则只执行最后一条CMD如果有多条命令希望在启动后执行,可以考虑使用shell 脚本与ENTRYPOINT的区别CMD的主要用途是为可执行的container提供默认命令CMD在运行时是可替换的,比如在ubuntu中,CMD指定的是/bin/bash。 默认情况下运行ubuntu,container中的/bin/bash会被执行如果使用docker run指定运行命令,那CMD会被替换掉如:docker run ubuntu /bin/echo this is a echo. 这时,container 启动后会执行echo 而不是/bin/bash了ENTRYPOINT是不会替换的,如果在ubuntu镜像中加入ENTRYPOINT,那ENTRYPOINT在启动后会先被执行CMD可以为ENTRYPOINT来提供参数例子:FROM ubuntu:14.10ENTRYPOINT [top, -b] CMD [-c]VOLUME语法:VOLUME [PATH]VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移可以将本地文件夹或者其他Container的文件夹挂载到Container中

经营性现金流量净额是否= 营业现金流

完全正确。

四个能力建设内容

一.扑救初期火灾的能力。 二.具备引导人员疏散能力。 三.查改身边火灾隐患能力。 四.消防宣传培训教育能力。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐