查看原文
其他

Dockerfile 常用指令总结

来源:https://url.cn/5VQ5h8w


官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了。
Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。
这里,给你介绍下编写Dockerfile常用指令。

FROM [:] [AS ]: 设置基础镜像

  1. FROM alpine:latest

RUN \ ["executable", "param1", "param2"]: 执行shell脚本。进来少使用RUN,因为没执行一次 docker就会增加一层只读层。

  1. RUN /bin/bash -c 'source $HOME/.bashrc; \

  2. echo $HOME'

  3. 等同于

  4. RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

  5. 等同于

  6. RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]

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

  1. FROM *:*

  2. CMD ["catalina.sh", "run"]

LABEL = = ... : 镜像标签

  1. LABEL "com.example.vendor"="ACME Incorporated"

  2. LABEL com.example.label-with-value="foo"

  3. LABEL version="1.0"

  4. LABEL description="This text illustrates \

  5. that label-values can span multiple lines."

EXPOSE [/...]: 暴露容器的端口

  1. EXPOSE 80/tcp

  2. EXPOSE 80/udp

ENV \ =: 设置容器环境变量。可以使用docker run --env=修改环境变量

  1. ENV myName JohnDoe

  2. ENV myDog RexTheDog

  3. ENV myCat fluffy

ADD [--chown=:] ... \ [--chown=:] ["",... ""]: 拷贝一个新文件,或者文件夹或者远程文件的 URLS,把他们添加到,镜像的文件系统中。 为绝对路径或者由WORKDIR定义的相对路径。

  1. ADD hom* /mydir/         # 添加所有以 "hom" 开头的文件

  2. ADD hom?.txt /mydir/     # ? 替换任何单个的字符, e.g., "home.txt"


  3. ADD test relativeDir/    # 添加 "test" 到 `WORKDIR`/relativeDir/

  4. ADD test /absoluteDir/   # 添加 "test" 到 /absoluteDir/


  5. ENV cpath /home/zb

  6. ARG zbpath=/home/lala

  7. WORKDIR $cpath

  8. ADD **.jpg $cpath

  9. ADD **.jpg $zbpath


  10. # 添加含有特殊字符的文件或者文件夹时如“[]”,需要遵循 golang 的规则将它们进行转义,以防它们为匹配模式

  11. ADD arr[[]0].txt /mydir/ # 复制一个文件名为 "arr[0].txt" 到 /mydir/


  12. # 通过 --chown 指定添加文件或者文件夹的用户名和组名

  13. ADD --chown=55:mygroup files* /somedir/

  14. ADD --chown=bin files* /somedir/

  15. ADD --chown=1 files* /somedir/

  16. ADD --chown=10:11 files* /somedir/

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

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

  1. ARG VERSION=latest

  2. FROM alpine:$VERSION

  3. ENTRYPOINT ["ls", "-la"]

ENTRYPOINT与CMD的比较

1.当有多个ENTRYPOINT CMD它们都只执行最后一个

2.当容器为一个可执行文件时应该定义ENTRYPOINT

3.当同时定义ENTRYPOINT 和 CMD时,CMD为ENTRYPOINT的默认参数

4.当docker执行run命令时,在里面指定CMD时,CMD将会被重写。

VOLUME ["/data"]: 在制作镜像时挂载卷。会在宿主机上自动生成一个对应的共享目录。

  1. RUN mkdir /data1

  2. RUN touch /data1/2a.txt

  3. VOLUME /data1


  4. # 通过命令 docker inspect hasVvolume

  5. "Mounts": [

  6.            {

  7.                "Type": "volume",

  8.                "Name": "0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321",

  9.                "Source": "/var/lib/docker/volumes/0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321/_data",

  10.                "Destination": "/data1",

  11.                "Driver": "local",

  12.                "Mode": "",

  13.                "RW": true,

  14.                "Propagation": ""

  15.            }

  16.        ]

  17. ========================================================================================================================

  18. # 也可以通过 docker run -v 来挂载共享目录,这时 Source 指出 -v 时定义的目录

  19. "Mounts": [

  20.        {

  21.                "Type": "bind",

  22.                "Source": "/Users/zhangbo/Desktop/data1",

  23.                "Destination": "/data1",

  24.                "Mode": "",

  25.                "RW": true,

  26.                "Propagation": "rprivate"

  27.            }

  28.        ]

容器中共享目录

  1. # 使用 --volumes-from,达到容器中文件夹共享

  2. 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 创建工作目录

  1. ENV DIRPATH /path

  2. WORKDIR $DIRPATH/$DIRNAME

  3. RUN pwd

ARG [=] : docker file中的变量

  1. FROM busybox

  2. ARG user1="zhang bo"

  3. ARG buildno

  4. RUN echo $user1

  5. RUN echo $buildno


  6. Step */* : RUN echo $user1

  7. ---> Running in a56a602a8f87

  8. zhang bo

  9. Removing intermediate container a56a602a8f87

  10. ---> 3e9c6ec19129

  11. Step */* : RUN echo $buildno

  12. ---> Runningin6598768a1080

预制变量

  1. FROM ubuntu

  2. ARG CONT_IMG_VER

  3. ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}

  4. RUN echo $CONT_IMG_VER


  5. # 可以通过 --build-arg 标签进行给定的预制的变量。--build-arg <varname>=<value>

  6. docker run --build-arg CONT_IMG_VER=******* .


- END -


往期推荐:

Kubernetes 高可用方案

Kubernetes日志输出方式与采集方案

Docker 核心技术与实现原理,值得一看!

优秀架构师必须掌握的 4 种架构思维

回顾 Kubernetes 最近 6 个版本重点更新

Kubernetes + Jenkins + Helm + Springboot 实践

Kubernetes 常见运维技巧

在 Kubernetes 中部署 Jenkins

Kubernetes 常见运维技巧

Kubernetes 污点与容忍详解

编写 Dockerfile 最佳实践


🔥
1万位K8S爱好者都在这里,您值得关注!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存