DockerFile构建过程解析

DockerFile构建过程解析

作者:全栈行动派 2023-06-08 07:37:42

云计算

云原生 Dockerfile通过编写文件直接构建镜像,在文件中编写需要安装的命令即可。

1、概述

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

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

官网:Dockerfile reference | Docker Documentation

2、构建步骤

  • 编码Dockerfile 文件
  • docker build命令构建镜像
  • docker run依镜像运行容器实例

3、构建解析过程

(1)Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
  • 指令按照从上到下,顺序执行。
  • #表示注释。
  • 每条指令都会创建一个新的镜像层并对镜像进行提交。

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

  • (1)docker从基础镜像运行一个容器
  • (2)执行一条指令并对容器作出修改
  • (3)执行类似docker commit的操作提交一个新的镜像层
  • (4)docker再基于刚提交的镜像运行一个新容器
  • (5)执行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# see https://www.apache.org/dist/tomcat/tomcat-8/KEYS# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)ENV 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://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394			"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://www.mail-archive.com/[email protected]/msg134940.html; https://mvnrepository.com/artifact/org.apache.tomcat/tomcat; https://repo1.maven.org/maven2/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"; \	\# https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#Default_web_applications	mv 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 dependencies	apt-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)# https://github.com/docker-library/tomcat/issues/77	find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \	\# fix permissions (especially for running as non-root)# https://github.com/docker-library/tomcat/issues/35	chmod -R +rX .; \	chmod 777 logs temp work; \	\# smoke test	catalina.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

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

MAINTAINER

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

RUN

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

EXPOSE

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

WORKDIR

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

USER

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

ENV

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

ADD

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

COPY

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

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

src:宿主机文件或者目录

desc:容器内目录

VOLUME

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

CMD

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

CMD是在docker run 时运行。

ENTRYPOINT

类似于 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 指令,仅最后一个生效。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/306431.html<

(0)
运维的头像运维
上一篇2025-05-26 15:57
下一篇 2025-05-26 15:59

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注