Dockerfile小技巧(通过变量指定程序配置文件内容)

思路:Dockerfile中定义变量,程序配置文件中使用占位符暂时代替变量内容,最后使用变量值替换占位符实现,这样就可以实现通过定义变量来定义程序启动时的一些参数了。

1、我以构建Nginx镜像为例,作为演示,Dockerfile文件如下:

FROM centos:7

# 定义默认变量
ENV NGINX_CONTEXT=/logs \
    NGINX_POR=4090 \
    USER=hyadmin \
    PASSWD=1qaz!QAZ. 

COPY . /usr/local/
RUN ln /usr/local/nginx/sbin/nginx /bin/nginx \
	&& yum install -y httpd-tools \
	&& rm -rf /var/cache/yum

# 健康检查
HEALTHCHECK --interval=10s --timeout=3s --start-period=10s \
  CMD curl -s -o /dev/null -w "%{http_code}" http://localhost:${NGINX_PORT}/docker || exit 1

CMD ["/bin/sh", "/usr/local/env"]

2、上面CMD指定了env脚本,在启动容器时执行env脚本,来替换占位符,内容如下:

#!/bin/sh
# 替换占位符内容
sed -i 's/<%= NGINX_PORT %>/'"$NGINX_PORT"'/g' /usr/local/nginx/conf/nginx.conf
sed -i 's#<%= NGINX_CONTEXT %>#'"$NGINX_CONTEXT"'#g' /usr/local/nginx/conf/nginx.conf

# 判断是否第一次启动
if ! [[ -x /usr/local/nginx/conf/htpasswd ]];then
	htpasswd  -b /usr/local/nginx/conf/htpasswd $USER $PASSWD
	chmod -x /usr/local/nginx/conf/htpasswd
fi
if ! [[ -d /usr/local/nginx/html/$NGINX_CONTEXT ]];then
	mkdir -p /usr/local/nginx/html/$NGINX_CONTEXT
fi

nginx -g 'daemon off;'

3、nginx配置文件内容如下:

events {
    worker_connections  10240;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
    	#  <%= NGINX_PORT %> 是 NGINX_PORT变量的占位符
        listen       <%= NGINX_PORT %>;
        server_name  localhost;
        charset utf-8;
        
		#  <%= NGINX_CONTEXT %> 是 NGINX_CONTEXT 变量的占位符
        location <%= NGINX_CONTEXT %> {
            root   /usr/local/nginx/html/;
            fancyindex on;
            fancyindex_localtime on;
            fancyindex_exact_size off;
            fancyindex_header "/Nginx-Fancyindex-Theme-light/header.html";
            fancyindex_footer "/Nginx-Fancyindex-Theme-light/footer.html";
            fancyindex_ignore "examplefile.html";
            fancyindex_ignore "Nginx-Fancyindex-Theme-light";
            fancyindex_ignore "Nginx-Fancyindex-Theme-dark";
            autoindex on;
            autoindex_localtime on;
            autoindex_exact_size on;
  	    autoindex_format html;
	    auth_basic 'please input your auth';
	    auth_basic_user_file htpasswd;
        }

	# docker探测使用
   	location /docker {
        	return 200;
    	}

    }
}

4、运行容器

docker run -itd \
    --name file-nginx \
    --restart always \
    --net host \
    -e USER=hyadmin \
    -e PASSWD='1qaz!QAZ.' \
    -e NGINX_PORT=9096 \
    -e NGINX_CONTEST=/logs \
    -v /usr/local/package:/usr/local/nginx/html/logs \  # 最后位置和NGINX_CONTEST变量对应上
    file-nginx:1.18.0

PS: -e 可以覆盖变量值,如果不覆盖默认变量则是Dockerfile中定义的内容!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神奇的海马体

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

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

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

打赏作者

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

抵扣说明:

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

余额充值