Docker-Dockerfile指令

Dockerfile

由一系列脚本和参数构成的脚本,这些命令应用于基础镜像,并最终创建一个新镜像

指令详解

FROM image_name:tag     定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name	    	镜像的创建者
EXPOSE           	容器需要暴露的端口,容器启动时通过-p进行映射绑定
VOLUME	        	  	挂载点,创建一个从本地主机或其他容器的挂载点
ENV key value	      	  	设置环境变量
RUN command	        	Dockerfile的核心部分,Build时执行(可以写多条)
ADD source_dir/file desc_dir/file	  将宿主机的文件复制到容器内,(自动解压)
COPY source_dir/file	      	和ADD类似,当目标路径不存在时,自动创建,但是如果有压缩文件并不能解压
WORKDIR path_dir	      	设置工作目录
CMD	            	容器的启动命令,只允许有一条,当容器启动时指定运行命令时,会覆盖掉Dockerfile中的CMD命令
ENTRYPOINT	          	容器的启动命令,值允许有一条,可被docker run提供的–entrypoint参数覆盖

CMD、RUN的区别

RUN是镜像Build的时候执行,用来预装软件和做配置使用;
CMD是镜像启动的时候执行的命令,
每个Dockerfile文件只能有一条CMD命令,如果有多条,只执行最后一条命令

ENTRYPOINT指令

也是只能有一条.不和CMD一起使用。如果启动容器时不指定容器参数,则CMD和ENTRYPOINT指令无区别,如果有容器参数。CMD指定的命令会被docker run传递的容器参数覆盖,而ENTRYPOINT会将容器参数作为ENTRYPOINT指令的参数执行。

COPY

格式:

COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
<源路径> 可以是多个,甚至可以是通配符

COPY package.json /usr/src/app/
COPY hom* /mydir/
COPY hom?.txt /mydir/

ADD

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
比如 <源路径> 可以是一个 URL,如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。

VOLUME

在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

VOLUME /data

这里的 /data 目录就会在容器运行时自动挂载为匿名卷。当然,运行容器时可以覆盖这个挂载设置。比如:

$ docker run -d -v mydata:/data xxxx

在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。

EXPOSE

格式为 EXPOSE <端口1> [<端口2>...]。

EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

ENV

设置环境变量,格式有两种:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

ARG

构建参数,格式:ARG <参数名>[=<默认值>]
构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。
该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。

ARG DOCKER_USERNAME=library
FROM ${DOCKER_USERNAME}/alpine

多阶段构建

Dockerfile:

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app
COPY . ./
RUN dotnet restore
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "FAN.Core2.dll"]

--from:从指定镜像拷贝文件
--from=0:从上一镜像拷贝文件
--from=xxx:从其他镜像拷贝文件
构建镜像:

docker build -t CorePublishImage .

运行容器:

docker run -it -p 5001:5001 CorePublishImage
posted @ 2020-01-08 15:51  .Neterr  阅读(164)  评论(0编辑  收藏  举报