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

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路分析 Docker Hub 上的 mysql:latest 镜像的 Dockerfile,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

下面我们来分析 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 设计得非常简单且易于维护,使用了最小化的镜像和软件包,且使用了一些最佳实践,如清理软件包缓存等。这些都是值得学习和借鉴的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156019.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!