分析 Docker Hub 上的 mysql:latest 镜像的 Dockerfile


下面我们来分析 Docker Hub 上的 mysql:latest 镜像的 Dockerfile。

镜像概述

该镜像的名称为 mysql:latest,是 MySQL 数据库的官方 Docker 镜像。该镜像基于 Debian,包含了 MySQL Server、MySQL 客户端和其他必需的库文件。

Dockerfile 内容分析
该 Dockerfile 共分为 3 个部分,分别是基础镜像的选择、软件安装和命令设置。

第一部分:基础镜像

FROM debian:buster-slim

这一行指定了该镜像的基础镜像,这里选择的是 Debian Buster slim 版本。

第二部分:软件安装

RUN apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        wget \
        lsb-release \
        gnupg \
    && rm -rf /var/lib/apt/lists/*

这一部分使用了 RUN 命令来安装一些必要的软件包,如 ca-certificates、curl、wget、lsb-release、gnupg 等。

apt-get update 用于更新软件源,apt-get install 用于安装软件包,-y 参数用于自动回答 yes,–no-install-recommends 参数用于避免安装推荐的软件包。

最后,rm -rf /var/lib/apt/lists/* 用于清理软件包缓存,可以减小镜像大小。

RUN groupadd -r mysql && useradd -r -g mysql mysql

这一行用于创建一个名为 mysql 的用户组和用户,并将其加入到 mysql 用户组中。在安装 MySQL Server 时,将使用该用户运行服务。

ENV MYSQL_MAJOR 8.0
ENV MYSQL_VERSION 8.0.28-1debian10

RUN { \
        echo mysql-community-server mysql-community-server/data-dir select ''; \
        echo mysql-community-server mysql-community-server/root-pass password ''; \
        echo mysql-community-server mysql-community-server/re-root-pass password ''; \
        echo mysql-community-server mysql-community-server/remove-test-db select false; \
    } | debconf-set-selections && \
    apt-get update && \
    apt-get install -y --no-install-recommends \
        mysql-community-server="${MYSQL_VERSION}" \
        mysql-community-client="${MYSQL_VERSION}" \
        pwgen \
        tzdata \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
    && rm -rf /etc/mysql/conf.d/ /etc/mysql/mysql.conf.d/ \
    && mkdir -p /etc/mysql/conf.d/ /etc/mysql/mysql.conf.d/ \
    && touch /var/log/mysql/error.log && chown mysql:mysql /var/log/mysql/error.log \
    && { \
        echo '[mysqld]'; \
        echo 'skip-host-cache'; \
        echo 'skip-name-resolve'; \
        echo 'datadir = /var/lib/mysql'; \
        echo '!includedir /etc/mysql/conf.d/'; \
        echo '!

第三部分:命令设置

VOLUME /var/lib/mysql

COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 3306 33060
CMD ["mysqld"]

这一部分主要用于设置镜像的命令和暴露端口。

  • VOLUME 指令用于将 /var/lib/mysql 目录作为数据卷,以便在运行容器时将其挂载到本地文件系统上。

  • COPY 命令用于将 Dockerfile 目录中的 docker-entrypoint.sh 文件复制到容器中的 /usr/local/bin/ 目录。

  • ln -s 命令用于创建一个符号链接,将 /usr/local/bin/docker-entrypoint.sh 链接到根目录,以便旧版 Docker 客户端仍然可以使用。

  • ENTRYPOINT 命令用于设置容器的入口点,并调用 docker-entrypoint.sh 脚本。

  • EXPOSE 命令用于设置容器需要暴露的端口。

  • CMD 命令用于设置容器启动后需要运行的命令,这里是 mysqld。

总结

该 Dockerfile 非常简洁,共包含了 3 个部分:基础镜像、软件安装和命令设置。在软件安装部分,使用了 apt-get update 命令更新软件源,apt-get install 命令安装了必要的软件包。在命令设置部分,使用了 VOLUME 指令将数据目录挂载到主机上,ENTRYPOINT 命令设置了入口点并调用了 docker-entrypoint.sh 脚本。

总体来说,该 Dockerfile 设计得非常简单且易于维护,使用了最小化的镜像和软件包,且使用了一些最佳实践,如清理软件包缓存等。这些都是值得学习和借鉴的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(~ ̄▽ ̄)~凤凰涅槃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值