DockerFile文件的编写

1、FROM [:] [AS ]: 设置基础镜像
FROM感觉就是继承的关系 比如你需要在tomcat里运行你的web应用,就可以通过from来继承父镜像在集成自己的应用来扩展镜像。
如果需要多个镜像呢?Docker 17.05版本以后,新增了Dockerfile多阶段构建。所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 FROM 指令。
多个 FROM 指令并不是为了生成多根的层关系,最后生成的镜像,仍以最后一条 FROM 为准,之前的 FROM 会被抛弃,那么之前的FROM 又有什么意义呢?
每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义

2、RUN \ ["executable", "param1", "param2"]:
执行shell脚本。
RUN /bin/bash -c 'source $HOME/.bashrc; \echo $HOME'
等同于
RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]

3、CMD ["executable","param1","param2"] \ ["param1","param2"] \ command param1 param2: DockerFile中只有一个CMD,多于一个将执行最后一个。它的意思差不多就是启动容器后执行的默认命令。

4、LABEL = = ... : 镜像标签
LABEL "com.example.vendor"="test mylaber"
LABEL com.example.label-with-value="test"
LABEL version="1.0"

5、EXPOSE [/...]: 暴露容器的端口
EXPOSE 80/tcp
EXPOSE 80/udp
ENV \ =: 设置容器环境变量。可以使用docker run --env =修改环境变量
ENV myName John Doe

6、ADD [--chown=:] ... \ [--chown=:] ["",... ""]: 拷贝一个新文件,或者文件夹或者远程文件的 URLS,把他们添加到,镜像的文件系统中。 为绝对路径或者由WORKDIR定义的相对路径。
ADD hom* /mydir/ # 添加所有以 "hom" 开头的文件
ADD hom?.txt /mydir/ # ? 替换任何单个的字符, e.g., "home.txt"
ADD test relativeDir/ # 添加 "test" 到 WORKDIR/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/

7、COPY [--chown=:] ... / [--chown=:] ["",... ""]: 与 ADD命令差不多。

ENTRYPOINT ["executable", "param1", "param2"] / command param1 param2: 容器启动后执行该命令。如果定义ENTRYPOINT 那么CMD形式就变为CMD ["param1","param2"] json数组中变为ENTRYPOINT的第一个参数和第二个参数

ARG VERSION=latest
FROM alpine:$VERSION
ENTRYPOINT ["ls", "-la"]
ENTRYPOINT与CMD的比较

当有多个ENTRYPOINT CMD它们都只执行最后一个
当容器为一个可执行文件时应该定义ENTRYPOINT
当同时定义ENTRYPOINT 和 CMD时,CMD为ENTRYPOINT的默认参数
当docker执行run命令时,在里面指定CMD时,CMD将会被重写。
VOLUME ["/data"]: 在制作镜像时挂载卷。会在宿主机上自动生成一个对应的共享目录。
RUN mkdir /data1
RUN touch /data1/2a.txt
VOLUME /data1

通过命令 docker inspect hasVvolume
"Mounts": [
{
"Type": "volume",
"Name": "0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321",
"Source": "/var/lib/docker/volumes/0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]

也可以通过 docker run -v 来挂载共享目录,这时 Source 指出 -v 时定义的目录
"Mounts": [
{
"Type": "bind",
"Source": "/Users/zhangbo/Desktop/data1",
"Destination": "/data1",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
容器中共享目录

8、使用 --volumes-from,达到容器中文件夹共享
docker run -itd --name noVvolume-v-1 --volumes-from noVvolume-v 48cd9e43b6a9
USER [:] / [:]: 给镜像添加一个用户
WORKDIR /path/to/workdir or WORKDIR to_workdir /path/to/workdir: 为 RUN, CMD, ENTRYPOINT, COPY, ADD 创建工作目录
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
ARG [=] : docker file中的变量
FROM busybox
ARG user1="zhang bo"
ARG buildno
RUN echo $user1
RUN echo $buildno

Step / : RUN echo $user1
---> Running in a56a602a8f87
zhang bo
Removing intermediate container a56a602a8f87
---> 3e9c6ec19129
Step / : RUN echo $buildno
---> Running in 6598768a1080
预制变量

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER $

RUN echo $CONT_IMG_VER

9、可以通过 --build-arg 标签进行给定的预制的变量。--build-arg =
docker run --build-arg CONT_IMG_VER=******* .

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.fengpt.cn/archives/DockerFile文件的编写