前言

我们在构建镜像的过程中经常要考虑到镜像的通用性,理想状态下的镜像可以通过传入不同的变量来适应不同的环境,这时候就需要借助 docker-entrypoint.sh 脚本来实现了,通过在创建容器的过程中使用 -e 或者 --env 设定环境变量,再由 docker-entrypoint.sh 脚本进行替换操作,替换默认值。

以制作一个 mysqld_exporter 镜像为例, mysqld_exporter 启动时需要指定被监控的数据库连接信息。

34b4dcd6ab073ad8c138f88efacf192f


1. 在Dockerfile中设定环境变量(ENV)

$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.illumos-amd64.tar.gz
$ vim Dockerfile
FROM registry.cn-guangzhou.aliyuncs.com/hzbb/alpine:3.17.3

MAINTAINER Hzbb
EXPOSE 9104/tcp
ENV MYSQL_HOST=${MYSQL_HOST} MYSQL_PORT=${MYSQL_PORT} MYSQL_USER=${MYSQL_USER} MYSQL_PASSWORD=${MYSQL_PASSWORD}

ADD mysqld_exporter-0.15.1.linux-amd64.tar.gz /usr/local
RUN mv /usr/local/mysqld_exporter-0.15.1.linux-amd64 /usr/local/mysqld_exporter
WORKDIR /usr/local/mysqld_exporter
COPY conf ./

ENTRYPOINT [ "/bin/sh", "docker-entrypoint.sh" ]
CMD ["/usr/local/mysqld_exporter/mysqld_exporter", "--config.my-cnf=/usr/local/mysqld_exporter/my.cnf"]
  • ENV 创建容器时传参的变量名,如 -e MYSQL_HOST=127.0.0.1
  • ENTRYPOINT 固定容器运行 docker-entrypoint.sh 脚本

2. 创建 my.cnf文件为数据库连接配置模板

$ mkdir conf && vim conf/my.cnf
[client]
host=MYSQL_HOST
port=MYSQL_PORT
user=MYSQL_USER
password=MYSQL_PASSWORD

3. 创建参数脚本 docker-entrypoint.sh

$ vim conf/docker-entrypoint.sh
#!/bin/bash
if [[ $MYSQL_HOST ]]; then
        sed -i 's/host=MYSQL_HOST/host="'$MYSQL_HOST'"/' my.cnf
fi
if [[ $MYSQL_PORT ]]; then
        sed -i 's/port=MYSQL_PORT/port="'$MYSQL_PORT'"/' my.cnf
fi
if [[ $MYSQL_USER ]]; then
        sed -i 's/user=MYSQL_USER/user="'$MYSQL_USER'"/' my.cnf
fi
if [[ $MYSQL_PASSWORD ]]; then
        sed -i 's/password=MYSQL_PASSWORD/password="'$MYSQL_PASSWORD'"/' my.cnf
fi
exec $@

创建容器时会执行这个脚本,如果有参数传递过来,则替换配置文件 my.cnf中的内容,也可增加 else 来判断当没有参数传递过来时使用默认值。


4. 编译该镜像

$ docker build -t mysqld_exporter:0.15.1 .

5. 创建容器

 $ docker  run -itd --name=mysqld_exporter \
     -p 9104:9104 \
     -e MYSQL_HOST=192.168.0.1 \
     -e MYSQL_PORT=3306 \
     -e MYSQL_USER=root \
     -e MYSQL_PASSWORD=admin123123 \
     mysqld_exporter:0.15.1

在创建容器时配置环境变量,由此实现在不同的环境中,都可以使用这个镜像监控不同的MySQL数据库


6. 结果验证

$ docker exec -i  mysqld_exporter cat my.cnf
  • 输出以下内容

    [client]
    host="192.168.0.1"
    port="3306"
    user="root"
    password="admin123123"
    
文章作者: hzbb
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 运维小记
云原生 Docker Docker
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝