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