『中级篇』Dockerfile详解(17)

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

####官网学习

https://docs.docker.com/engine/reference/builder/#usage

####FROM

必须为第一个命令,指定基础镜像

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM scratch #制作base Image
FROM centos #使用base Image
FROM centos:7.9
FROM mysql:5.6

尽量使用官方的image作为base image!那是经得起考验的!

####LABEL

给镜像添加信息。使用docker inspect可查看镜像的相关信息

LABEL maintainer="394498036@qq.com"
LABEL version="1.0"
LABEL description="This is description \
欢迎关注:编程坑太多,我在等你."

其实就类似咱们写代码的注释,很多人写代码不愿意写注释,其实写注释对自己的负责,过段时间翻坑的时候,想想当初的意思,容易很快的解决,所以一定要写LABEL

####RUN

构建镜像时执行的命令

RUN yum update && yum install -y vim \
          python-dev #反斜线换行
RUN  apt-get update && apt-get install -y perl \
          pwgen --no-install-recommends && rm -rf \
          /var/lib/apt/lists/*   #注意清理cache
RUN  /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

为了美观,复杂的RUN请用反斜线换行,避免无用分层,合并多条命令成一行!

####WORKDIR

工作目录

WORKDIR /test #如果没有会自动创建test目录
WORKDIR jianshu
RUN pwd          #输出结果应该是/test/jianshu

用WORKDIR,不要用RUN cd 尽量使用绝对目录!

####ADD and COPY

将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压

同ADD,只是不会解压文件。

ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
COPY <src>... <dest>
COPY ["<src>",... "<dest>"] 用于支持包含空格的路径
ADD hello /
ADD test.tar.gz / #添加到根目录并解压
WORKDIR /root
ADD hello test/ # /root/test/hello
WORKDIR /root
COPY hello test/ # /root/test/hello

大部分情况,COPY优于ADD,ADD除了COPY还有额外功能(解压缩)!添加远程文件/目录请使用curl 或者wget

####ENV

设置环境变量

ENV <key> <value>
ENV <key>=<value> ...
ENV MYSQL_VERSION 5.6
E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常亮

尽量多使用,减少维护成本!

学习下面的先了解下

Shell 和Exec 格式Shell格式RUN apt-get install -y vim CMD echo "hello docker 微信公众号:编程坑太多" ENTRYPOINT echo "hello docker 微信公众号:编程坑太多"Exec格式RUN ["apt-get", "install", " -y", "vim"] CMD ["/bin/echo","hello docker 微信公众号:编程坑太多"] ENTRYPOINT ["/bin/echo","hello docker 微信公众号:编程坑太多"]undefinedDockerfile1FROM centos ENV name Docker ENTRYPOINT echo "hello $name"Dockerfile2FROM centos ENV name Docker ENTRYPOINT ["/bin/echo", "hello $name"]通过实际的例子查看区别。mkdir cmd-entrrypoint cd cmd-entrrypoint/ vi Dockerfile先执行Dockerfile1

more Dockerfile
docker build -t liming/centos-entrypoint-shell .
docker run liming/centos-entrypoint-shell 
  • 先执行Dockerfile2
more Dockerfile
docker build -t  liming/centos-entrypoint-exec .
docker run  liming/centos-entrypoint-exec

我们通过shell格式运行的话,它会通过默认的bash里面通过shell执行命令,它会通过shell替换这边变量,通过exec格式运行的话,只是单纯的执行echo,没办法帮我们替换到$name。如何解决不一样的问题呢?请开始我的表演!修改Dockerfile2

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c", "echo hello  $name"]
docker build -t liming/centos-entrypoint-exec-new .
docker run liming/centos-entrypoint-exec-new

是不是很nice!

####CMD

设置容器启动后默认执行的命令和参数

  • 容器启动时默认执行的命令
  • 如果docker run 指定了其他命令,CMD命令被忽略
  • 如何定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"
docker build -t liming/centos-cmd-shell .
docker run liming/centos-cmd-shell
docker run -it liming/centos-cmd-shell /bin/bash

####ENTRTYPOINT

设置容器启动时运行的命令

  • 让容器以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"
docker build -t liming/centos-entrypoint-shell .
docker run liming/centos-entrypoint-shell
docker run -it liming/centos-entrypoint-shell /bin/bash

PS:Dockerfile详解基本就介绍这么多,可能还有很多命令没有讲解,以后用到了在说吧。一定要CMD和ENTRTYPOINT因为很多官方的都常用这两个命令。


image

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Debian社区

Docker 快速入门之 Dockerfile

在容器环境中,我们可以通过容器创建一个我们自定义过的镜像,那么我们是否可以直接通过基础的镜像直接自定义镜像呢?答案当然是可以的,在 Docker 中我们可以从名...

10510
来自专栏姚俊刚的专栏

在腾讯云服务器上体验 Docker

在腾讯云的 ubuntu 服务器上安装和运行 Docker,Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。

7.3K20
来自专栏容器云生态

构建属于自己的原生docker images

制作image原生镜像需要使用febootstrap工具,需要注意的是,在centos7系列中,默认的源中不带此包,但是在centos6系列中,该包是默认可用使...

382110
来自专栏搜云库

Docker Hub 仓库使用,及搭建 Docker Registry

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像。大部分需求都可以通过在 Docker Hub 中...

53350
来自专栏吴伟祥

Docker-Compose安装Java Web实例

本文参考: docker学习笔记之五:进阶实战--mysql+tomcat Docker-Compose的介绍可参考:Docker学习——Docker 三...

66920
来自专栏大数据架构师专家

docker系列-运行nginx静态网站

nginx 是一个web服务器,需要持久运行的服务器,而且我们一般选择在后台运行.

16820
来自专栏大闲人柴毛毛

Docker入门实战(三)——用Dockerfile构建镜像

在Docker中,构建一个自定义镜像共有两种方法,一是通过commit指令构建,二是通过Dockerfile文件构建。第一种方式在上篇博客中已经详细介绍(Doc...

34750
来自专栏散尽浮华

Docker容器学习梳理--SSH方式登陆容器

前面几篇已经介绍了Docker基础环境的部署,下面介绍下通过ssh方式登陆Docker容器的操作记录(其实不太建议直接用ssh去连接上容器的想法,虽然可以,但是...

22450
来自专栏搜云库

Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo

Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo

308110
来自专栏Java架构师进阶

Spring Boot 集成Mybatis实现主从(多数据源)分离方案

参考资料:https://store.docker.com/images/mysql

15650

扫码关注云+社区

领取腾讯云代金券