在docker容器中如何自动生成配置文件?以nginx配置为例

  应用场景类似于多个域名要起多个容器,有些参数有些域名需要,有些域名不需要,或者参数的值不太一样,需要去对应的配置文件修改,不太灵活,如果通过变量的方式直接定义在Dockerfile文件中,需要哪些参数,不需要哪些参数,哪些参数需要修改对应的值,直接在Dockerfile中修改岂不美哉?下面的方法仅仅起到抛砖引玉的作用,具体业务还需要写对应的脚本和Dockerfile;

方法一

1、通过shell脚本的方式,生成所需的配置文件;

vim nginx-web.sh

#!/bin/bash

PORT=$1

SERVER_NAME=$2

echo "server {

  listen ${PORT};

  server_name ${SERVER_NAME};

  root /data/yum;

  charset UTF-8;

  autoindex on;

  autoindex_exact_size off;

  autoindex_localtime on;

  location / {

    if (\$request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){

      return 200;

    }

  }

}" > /etc/nginx/conf.d/web.conf

/usr/sbin/nginx -g "daemon off;"

2、编辑dockerfile文件

  FROM centos:7

  MAINTAINER "1072051214@qq.com"

  COPY CentOS-Base.repo epel.repo /etc/yum.repos.d/

  RUN yum install nginx -y && \

    yum clean all

  COPY ["nginx.conf","/etc/nginx/"]

  COPY ["nginx-web.sh","/tmp"]

  RUN chmod +x /tmp/nginx-web.sh

  EXPOSE 80/tcp

3、构建镜像

  docker build -t zhang/nginx:v0.9 ./

4、运行镜像测试

  docker run --rm zhang/nginx:v0.9 /tmp/nginx-web.sh 80 www.123.com

  通过docker exec -it ID /bin/bash进入容器查看验证

方法二

通过envsubst命令来实现

1、编辑模版文件nginx-web.tpl

server {

  listen ${PORT};

  server_name ${DOMAIN};

  root /data/yum;

  charset UTF-8;

  autoindex on;

  autoindex_exact_size off;

  autoindex_localtime on;

  location / {

    if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){

      return 200;

    }

  }

}

2、编辑Dockerfile文件

  FROM centos:7

  MAINTAINER "1072051214@qq.com"

  COPY CentOS-Base.repo epel.repo /etc/yum.repos.d/

  RUN yum install nginx gettext -y && \ #envsubst命令在容器中默认没有,需要安装gettext包;

    yum clean all

  ENV PORT="80"

  ENV DOMAIN="www.123.com"

  COPY ["nginx-web.tpl","/etc/nginx/conf.d/nginx-web.tpl"]

  CMD envsubst '$PORT $DOMAIN' </etc/nginx/conf.d/nginx-web.tpl> /etc/nginx/conf.d/web.conf && nginx -g "daemon off;"

  EXPOSE 80/tcp

3、构建镜像

  docker build -t zhang/nginx:v1.2 ./

4、运行镜像测试

  docker run --rm zhang/nginx:v1.2

  通过docker exec -it ID /bin/bash进入容器查看验证