当前位置: 首页 > 科技观察

DockerDockerfile自定义镜像

时间:2023-03-17 11:21:28 科技观察

1.FROMFROM指令用于指定用于稍后构建新图像的基础图像。FROMFROM:FROM:FROM必须是Dockerfile中第一个非注释命令在一个Dockerfile中创建多个镜像时,docker17.05版本之后,FROM可以出现多个次。在每个新命令FROM之前,记录提交的最后一个镜像ID。?标签或摘要是可选的。如果不使用这两个值,将使用最新版本的基础映像。多次使用FROM时,基础镜像golang:1.10.3在构建和运行场景分离时非常大。因为它包含了Go语言所有的编译工具和库,而我们只需要运行时编译好的服务端程序,不需要编译时的编译工具,所以最终生成的大体积镜像是一种浪费。scratch是内置关键字,不是真实图像。FROMscratch将使用完全干净的文件系统,不包含任何文件。因为Go语言编译后不需要运行时,所以不需要安装任何运行时库。FROMscratch可以最小化最终生成的镜像,只包含服务器程序。当然你也可以FROM一个你熟悉的、占用空间小的镜像,比如:centos、ubuntu、busybox等。#编译阶段FROMgolang:1.10.3COPYserver.go/build/WORKDIR/buildRUNCGO_ENABLED=0GOOS=linuxGOARCH=amd64GOARM=6gobuild-ldflags'-w-s'-oserver#RunphaseFROMscratch#From编译阶段,将编译结果复制到当前镜像中。COPY--from=0/build/server/ENTRYPOINT["/server"]COPY命令的--from=0参数将文件从前一阶段复制到当前阶段,当有多个FROM语句时,0代表第一阶段。除了用数字,我们还可以给stage命名,比如:#编译阶段命名为builderFROMgolang:1.10.3asbuilder#...omitted#TherunningstageFROMscratch#从编译阶段复制编译结果到当前镜像COPY--from=builder/build/server/COPY--from不仅可以从pre-stage复制,也可以直接从已有镜像复制。例如,FROMubuntu:16.04COPY--from=quay.io/coreos/etcd:v3.3.9/usr/local/bin/etcd/usr/local/bin/2。COPYCOPY还用于将构建环境或目录中的文件复制到镜像中。COPY...COPY["",...""]COPY--from=builder/build/server/COPY--from=quay.io/coreos/etcd复制代码:v3.3.9/usr/local/bin/etcd/usr/local/bin/COPY命令和ADD很相似,不同的是COPY只会复制build目录下的文件,不能使用url,也不会进行解压操作被执行。3.ADDADD用于将构建环境中的文件或目录复制到镜像中。ADD...ADD["",...""]?指定源文件位置,指定目标位置。?可以是构建上下文中的文件或目录,也可以是URL,但不能访问构建上下文之外的文件或目录。ADD复制一个网络文件:ADDhttps://img.ydisp.cn/news/20221208/0gft2cjbwsl.zip$WORKER_PATH另外,如果你使用本地压缩包(gzip、bzip2、xz),Docker会自动解压它操作类似于使用tar-x4。RUNRUN用于在镜像容器中执行命令,命令执行方式有两种:shell执行这种方式命令会在shell中执行,Linux下默认使用/bin/sh-c,使用Windows下的cmd/S/C。注意:通过SHELL命令修改RUN使用的默认shellRUNRUN/bin/bash-c'source$HOME/.bashrc;\echo$HOME'#通过RUN执行多条命令时,可以通过\newline/bin/bash-c'source$HOME/.bashrc;执行RUN;echo$HOME'#在同一行,用分号分隔命令exec执行RUN创建的中间镜像["executable","param1","param2"]RUN命令会被缓存起来,会在下一个构建。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:dockerbuild--no-cache。5、CMDCMD用于指定容器启动时要执行的命令。CMD有以下三种格式:CMD["executable","param1","param2"]CMD["param1","param2"]CMD命令param1param2CMD与RUN不同,CMD用于指定运行时执行什么容器启动命令,RUN用于指定构建镜像时要执行的命令。CMD和RUN在功能实现上也有相似之处。例如:dockerrun-t-ighostwritten/web_server/bin/true等同于:cmd["/bin/true"]?Dockerfile中CMD只能指定一次,如果指定多次,前面的命令将被执行被覆盖。?dockerrun命令还将覆盖Dockerfile中的CMD命令。6.ENTRYPOINTENTRYPOINT用于为容器配置一个可执行程序。即每次使用镜像创建容器时,都会将ENTRYPOINT指定的程序设置为默认程序。ENTRYPOINT有以下两种形式:ENTRYPOINT["executable","param1","param2"]ENTRYPOINTcommandparam1param2ENTRYPOINT和CMD很相似,不同的是dockerrun执行的命令不会覆盖dockerrun中的ENTRYPOINTcommand指定的任何参数都将作为参数再次传递给ENTRYPOINT。?Dockerfile中只允许有一个ENTRYPOINT命令。如果指定了多个,之前的设置将被覆盖,只执行最后一个ENTRYPOINT命令。dockerrun运行容器时指定的参数会传递给ENTRYPOINT,并会覆盖CMD命令指定的参数。例如执行dockerrun-d时,会将-d参数传递给入口点。ENTRYPOINT入口点也可以通过dockerrun--entrypoint覆盖。示例:ENTRYPOINT["/usr/bin/nginx"]DockerfileFROMubuntu:16.04RUNapt-getupdateRUNapt-getinstall-ynginxRUNecho'HelloWorld,I'macontainer'>/var/www/html/index.htmlhtmlEXPOSE80ENTRYPOINT["/usr/sbin/nginx"]构建dockerbuild-t="ghostwritten/app"。创建容器dockerrun-i-tghostwritten/app-g"daemonoff;"-g"daemonoff;"参数会传递给ENTRYPOINT,最后在容器中执行的命令是/usr/sbin/nginx-g"daemonoff;"。7.LABELLABEL用于给图片添加元数据,元数据以键值对的形式指定:LABEL===...使用LABEL指定元数据在指定数据时,一个LABEL规范可以指定一个或多个元数据。当指定多个元数据时,不同的元数据之间用空格分隔。LABELversion="1.0"description="Thisisawebserver"by="ghostwritten"也可以包装LABELmulti.label1="value1"\multi.label2="value2"\other="value3"dockerinspect视图:$dockerinspectitbilu/test"Labels":{"version":"1.0","description":"Thisisawebserver","by":"ghostwritten"},注意:还有一个MAINTAINER命令在Dockerfile,该命令用于指定镜像作者。但是不推荐使用MAINTAINER,建议使用LABEL来指定镜像作者。如:LABELmaintainer="ghostwritten"8、EXPOSEEXPOSE用于指定容器在运行时监听的端口:EXPOSE[...]EXPOSE不允许容器的端口访问主人。要使其可访问,需要在dockerrun运行容器时通过-p发布这些端口,或者通过-P参数发布EXPOSE导出的所有端口。9.ENVENV用于设置环境变量,有以下两种设置形式:ENVENV=...例:ENV$WORKER_PATH/myapp设置后,该环境变量在ENV中可以在命令后使用。例如:WORKERDIR$WORKER_PATHdockerrun可以添加环境变量或者通过-e覆盖环境变量。dockerrun-tid--nametest-e$WORKER_PATH/web-eIP=192.168.1.2ghostwritten/web:v1.0-e$WORKER_PATH/web覆盖ENV$WORKER_PATH/myapp-eIP=192.168。1.2是新增加的10.VOLUMEVOLUME用于创建挂载点,即在基于构建镜像创建的容器中添加卷:VOLUME["/data"]一个卷可以存在于一个的指定目录下或多个容器,目录可以绕过联合文件系统,具有以下功能:卷可以在容器之间共享和重用。容器不必与其他容器共享卷。对卷的修改将立即生效。volume的修改不会影响镜像的创建容器可以访问宿主机的数据。dockerrun-itd--nameweb-v~/data:/web/ghostwritten/web:v1.011。USERUSER用于指定用于运行镜像的用户,可以使用用户名、UID或GID,或两者的组合。USERuserUSERuser:groupUSERuidUSERuid:gidUSERuser:gidUSERuid:groupdockerrun运行容器时,可以通过-u参数覆盖指定用户。12、WORKDIRWORKDIR用于在容器中设置一个工作目录:WORKDIR/path/to/workdir通过WORKDIR设置工作目录后,后续在Dockerfile中的RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在此目录中执行。WORKDIR/aWORKDIRbWORKDIRcRUNpwdpwd最终会在/a/b/c目录下执行。dockerrun运行容器时,可以通过-w参数覆盖构建时设置的工作目录。13.ARGARG用于指定传递给构建运行时的变量:ARG[=]示例:ARGsiteARGbuild_user=ghostwritten上面我们指定了两个变量site和build_user,其中build_user指定了默认值。在使用dockerbuild构建镜像时,可以通过--build-arg=参数指定或重新设置这些变量的值。$dockerbuild--build-argsite=ghostwritten-tghostwritten/test.14。ONBUILDONBUILD用于设置镜像触发器:ONBUILD[INSTRUCTION]ONBUILDADD./app/srcONBUILDRUN/usr/local/bin/python-build--dir/app/src当构建镜像作为其他镜像的基础镜像时,此图像中的触发器将由键触发。示例:构建镜像的第一个Dockerfile,文件名为base.dfFROMbusybox:latestWORKDIR/appRUNtouch/app/base-evidenceONBUILDRUNls-al/appbuilddockerbuild-tghostwritten/onbuild:v1.0-f根据。DF。第二个构建镜像的Dockerfile,文件名downstream.dfFROMghostwritten/onbuild:v1.0RUNtouchdownstream-evidenceRUNls-al。builddockerbuild-tghostwritten/onbuild_down:v1.0-fdownstream.df.onbuildcommand第一次构建时不会执行,第二次引用时会先执行。15、STOPSIGNALSTOPSIGNAL用于设置停止容器时发送的系统调用信号:STOPSIGNAL信号使用的信号必须是内核系统调用表中合法的值,如:9、SIGKILL。16.SHELLSHELL用于设置默认的用于执行命令的shell类型(shell风格):SHELL["executable","parameters"]SHELL在Windows环境下比较有用。Windows下通常有两个shell,cmd和powershell。可能还有sh。然后你可以使用SHELL来指定使用的shell类型。参考:?DockerDockerfile[1]?使用Dockerfile自定义镜像[2]?Dockerfile参考[3]参考链接[1]DockerDockerfile:https://www.runoob.com/docker/docker-dockerfile.html[2]使用Dockerfile自定义镜像:https://yeasy.gitbook.io/docker_practice/image/build[3]Dockerfile参考:https://docs.docker.com/engine/reference/builder/

最新推荐
猜你喜欢