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文件的编写