成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DockerFile構(gòu)建過(guò)程解析

云計(jì)算 云原生
Dockerfile通過(guò)編寫文件直接構(gòu)建鏡像,在文件中編寫需要安裝的命令即可。

1、概述

Dockerfile是用來(lái)構(gòu)建Docker鏡像的文本文件,是由一條條構(gòu)建鏡像所需的指令和參數(shù)構(gòu)成的腳本。

在Docker 常用命令篇中,我們已經(jīng)知道了2中構(gòu)建鏡像的方式 export\import 和 commit方式。這兩種方式都需要先運(yùn)行并創(chuàng)建容器,然后在容器中安裝vim、ifconfig等命令,然后再重新構(gòu)建加強(qiáng)版的鏡像,比較麻煩。Dockerfile通過(guò)編寫文件直接構(gòu)建鏡像,在文件中編寫需要安裝的命令即可。

官網(wǎng):Dockerfile reference | Docker Documentation

2、構(gòu)建步驟

  • 編碼Dockerfile 文件
  • docker build命令構(gòu)建鏡像
  • docker run依鏡像運(yùn)行容器實(shí)例

3、構(gòu)建解析過(guò)程

(1)Dockerfile內(nèi)容基礎(chǔ)知識(shí)

  • 每條保留字指令都必須為大寫字母且后面要跟隨至少一個(gè)參數(shù)。
  • 指令按照從上到下,順序執(zhí)行。
  • #表示注釋。
  • 每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層并對(duì)鏡像進(jìn)行提交。

(2)Docker執(zhí)行Dockerfile的大致流程

  • (1)docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
  • (2)執(zhí)行一條指令并對(duì)容器作出修改
  • (3)執(zhí)行類似docker commit的操作提交一個(gè)新的鏡像層
  • (4)docker再基于剛提交的鏡像運(yùn)行一個(gè)新容器
  • (5)執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成

4、常用指令詳解

(1)咱們先看下tomcat8 的Dockerfile 文件內(nèi)容

# 繼承至eclipse-temurin:8-jdk-focal
FROM eclipse-temurin:8-jdk-focal

# 設(shè)置環(huán)境變量
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"

# 設(shè)置工作目錄
WORKDIR $CATALINA_HOME

# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV 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 F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23

ENV TOMCAT_MAJOR 8
ENV TOMCAT_VERSION 8.5.84
ENV TOMCAT_SHA512 e595e906d62ff16545318108478aa101103181569dc6f4549dd0cdf8744147f7e9ba8a88cab6d33237b22981acb1085de86e7b2a4f1659efdbd4804df1303561

# 執(zhí)行相關(guān)指令
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/users@tomcat.apache.org/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 properly
RUN 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

# 執(zhí)行命令 就是 執(zhí)行 catalina.sh 啟動(dòng)tomcat
CMD ["catalina.sh", "run"]

(2)常用指令作用說(shuō)明

指令

說(shuō)明

FROM

基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的,指定一個(gè)已經(jīng)存在的鏡像作為模板,第一條必須是FROM

MAINTAINER

鏡像維護(hù)者的姓名和郵箱地址

RUN

容器構(gòu)建時(shí)需要運(yùn)行的命令,運(yùn)行shell格式和exec格式 命令,RUN是在 docker build時(shí)運(yùn)行

EXPOSE

當(dāng)前容器對(duì)外暴露出的端口

WORKDIR

指定在創(chuàng)建容器后,終端默認(rèn)登陸的進(jìn)來(lái)工作目錄,一個(gè)落腳點(diǎn)

USER

指定該鏡像以什么樣的用戶去執(zhí)行,如果都不指定,默認(rèn)是root

ENV

用來(lái)在構(gòu)建鏡像過(guò)程中設(shè)置環(huán)境變量

ADD

將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像且會(huì)自動(dòng)處理URL和解壓tar壓縮包

COPY

類似ADD,拷貝文件和目錄到鏡像中。
將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置

兩種方式 1:COPY src dest 2:COPY ["src", "dest"]

src:宿主機(jī)文件或者目錄

desc:容器內(nèi)目錄

VOLUME

容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作

CMD

Dockerfile 中可以有多個(gè) CMD 指令,但只有最后一個(gè)生效,CMD 會(huì)被 docker run 之后的參數(shù)替換

CMD是在docker run 時(shí)運(yùn)行。

ENTRYPOINT

類似于 CMD 指令,但是ENTRYPOINT不會(huì)被docker run后面的命令覆蓋,
而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序

命令格式:ENTRYPOINT可以和CMD一起用,一般是變參才會(huì)使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參。當(dāng)指定了ENTRYPOINT后,CMD的含義就發(fā)生了變化,不再是直接運(yùn)行其命令而是將CMD的內(nèi)容作為參數(shù)傳遞給ENTRYPOINT指令,

他兩個(gè)組合會(huì)變成 案例如下:

假設(shè)已通過(guò) Dockerfile 構(gòu)建了 nginx:test 鏡像:是否傳參按照dockerfile編寫執(zhí)行傳參運(yùn)行Docker命令docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf衍生出的實(shí)際命令nginx -c
/etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

優(yōu)點(diǎn):在執(zhí)行docker run的時(shí)候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)。

缺點(diǎn):如果 Dockerfile 中存在多個(gè) ENTRYPOINT 指令,僅最后一個(gè)生效。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2011-09-06 13:19:04

MTK手機(jī)軟件系統(tǒng)

2014-11-18 10:37:15

dockerlinux技巧

2021-04-28 10:30:46

BuildKitDockerfileLinux

2023-09-12 08:03:49

容器鏡像

2017-05-16 11:20:51

SQL語(yǔ)句解析

2009-12-29 15:38:17

silverlight

2010-03-29 10:50:04

安裝Nginx

2020-11-02 13:24:49

MySQL數(shù)據(jù)庫(kù)存儲(chǔ)

2010-02-22 13:38:50

Python解析器

2014-06-23 10:31:09

Android啟動(dòng)過(guò)程

2010-09-10 20:03:11

tftp服務(wù)

2012-12-19 14:38:52

2011-09-01 10:01:35

PhoneGap應(yīng)用程序GoodDay

2017-02-27 09:36:01

AndroidMVVM架構(gòu)

2019-10-21 11:43:00

DockerGradleJava

2010-06-30 13:56:32

構(gòu)建FTP服務(wù)器

2017-02-07 09:54:43

JVMJavaClass

2023-10-30 11:01:37

Buildpack云原生

2019-08-14 17:13:23

大數(shù)據(jù)MapReduce框架

2018-02-02 15:48:47

ChromeDNS解析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品a免费一区久久电影 | 久久不射电影网 | 日韩在线看片 | 欧美成人精品 | 91久久精品日日躁夜夜躁欧美 | 青青激情网 | 免费观看毛片 | 国产精品不卡 | 国产精品伦理一区二区三区 | 男女视频在线免费观看 | www国产成人免费观看视频 | 国产成人啪免费观看软件 | 国产精品久久国产精品久久 | 91欧美激情一区二区三区成人 | 一区二区电影 | 中文字幕日韩一区 | jlzzxxxx18hd护士 | 天天干在线播放 | 最新国产福利在线 | 久久av一区二区三区 | 中文字幕av高清 | 九九久视频 | 深爱激情综合 | 精品日韩一区二区 | 99亚洲国产精品 | 黄色在线免费观看视频网站 | 国产精品毛片一区二区三区 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲成人精品国产 | 91精品入口蜜桃 | 国产精品成人一区二区 | 天天躁天天操 | 在线观看免费高清av | 中文字幕二区 | 乳色吐息在线观看 | 免费观看的av毛片的网站 | 成人依人 | 99re热精品视频 | 日韩欧美在线观看一区 | 日本aⅴ中文字幕 | 久久久久久亚洲精品 |