docker系列之(十)Dockerfile的常用命令

一、镜像分类

  • 基础镜像:例如centos、Ubuntu、alpine
  • 环境镜像:例如:java、php、go、node
  • 项目镜像:将项目与环境镜像打包一起

二、DockerFile常用指令

  • FROM 构建新镜像是基于哪个镜像
  • LABEL 标签
  • RUN 构建镜像时运行的Shell命令
  • COPY 拷贝文件或目录到镜像中
  • ADD 解压压缩包并拷贝
  • ENV 设置环境变量
  • USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
  • EXPOSE声明容器运行的服务端口
  • WORKDIR 为RUN\CMD\ENTPYPOINT\COPY和ADD设置工作目录
  • CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效
  • ENTRYPOINT 如果与CMD一起用,CMD将作为ENTRYPOINT的默认参数,如果有多个ENTRYPOINT指令,最后一个生效。

三、根据DockerFile构建镜像

docker build

-t #镜像名称
-f #指定Dockerfile文件位置

#docker build -t fox/jave-demo .
#docker build -t fox/jave-demo -f /path/Dockerfil/path

四、一个简单的dockerfile例子

FROM centos:7
LABEL maintainer Fox
RUN yum install wget curl -y
USER root
COPY a.txt /opt
ADD b.tar.gz /opt
ENV ABC=123
EXPOSE 80
WORKDIR /usr/local
CMD ["sleep","36000"]

五、COPY和ADD详解

5.1 COPY 和 ADD 作用

COPY 和 ADD 命令不能拷贝上下文之外的本地文件【即Dockerfile目录】

例如: Dockerfile 在/docker-copy中,在/tmp文件下touch一个a.txt。

在Dockerfile添加“COPY /tmp/a.txt ./”最终docker build无法正常进行

docker、技术与框架、新兴技术能力docker系列之(十)Dockerfile的常用命令插图
COPY check* /testdir/           # 拷贝所有 check 开头的文件
COPY check?.log /testdir/       # ? 是单个字符的占位符,比如匹配文件 

COPY 和 ADD 命令具有相同的特点:只复制目录中的内容而不包含目录自身

5.2与 WORKDIR 协同工作

WORKDIR /app
COPY checkredis.py .

文件会复制到容器中 /app目录

六命令CMD详解

6.1CMD命令的用法

  • exec形式 :CMD [“可执行路径”,”参数”]
  • 作为ENTRYPOINT默认参数:CMD [“参数一”,”参数二”]
  • shell形式: CMD command 参数一 参数二

6.1.1CMD的exec形式

--------创建一个Dockerfile
FROM centos:7
LABEL maintainer Fox
COPY run.sh /usr/bin
EXPOSE 80
USER:root
WORKDIR /usr/local
CMD ["run.sh","My","Fox"]
-----创建一个run.sh脚本,并能使用参数
#!/bin/bash
echo "Hello" $1 $2
sleep 3600

显示命令:

shell>docker build -t cmdtest1 .
shell>chmond +x run.sh
shell>docker run -it --name cmdtest1 cmdtest1

注意:CMD 这种方式不行传入变量

FROM centos:7
LABEL maintainer Fox
COPY run.sh /usr/bin
EXPOSE 80
ENV Name=Fox
USER:root
WORKDIR /usr/local
CMD ["run.sh","My","$Name"]
-------最后输出 hell My $Name。如何修改呢?参考下方
CMD ["sh","-c","/usr/bin/run.sh $Name"]

6.1.2CMD的shell形式

FROM centos:7
LABEL maintainer Fox
COPY run.sh /usr/bin
EXPOSE 80
ENV Name=Fox
USER:root
WORKDIR /usr/local
CMD /usr/bin/run.sh my $Name

注意:在docker run 可以重新定义CMD,但不能重定义ENTRYPOINT

例如:docker run -it –name cmdtest1 cmdtest1 run.sh myFox

七ENTRYPOINT的命令详解

  • exec形式 : ENTRYPOINT [“可执行路径”,”参数”]
  • shell形式: ENTRYPOINT command 参数一 参数二

这两种方式,跟上面的CMD一样,例子上把CMD更改即可。

下面我们讲解一下docker的批处理管理工具,docker-compose

https://www.fcors.com/%E6%8A%80%E6%9C%AF%E4%B8%8E%E6%A1%86%E6%9E%B6/%E6%96%B0%E5%85%B4%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B/dockercompose/