Docker 构建可传参镜像
前言
我们在构建镜像的过程中经常要考虑到镜像的通用性,理想状态下的镜像可以通过传入不同的变量来适应不同的环境,这时候就需要借助 docker-entrypoint.sh
脚本来实现了,通过在创建容器的过程中使用 -e
或者 --env
设定环境变量,再由 docker-entrypoint.sh
脚本进行替换操作,替换默认值。
以制作一个 mysqld_exporter
镜像为例, mysqld_exporter
启动时需要指定被监控的数据库连接信息。
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"
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
运维小记!
喜欢就支持一下吧
打赏
微信
支付宝