如何使用dyanmic Docker Option运行nodejs和nginx?

时间:2018-03-29 15:13:48

标签: docker nginx

我是node和nginx的新手。我的任务是构建一个托管动态内容的简单网络服务器。 Web服务器的一个非常关键的部分是从用户那里获取有关要使用的端口的输入,要使用的任何自定义域(代替localhost),来自安装程序的SSL证书等[ 它应该被构建对于docker ]但我不知道如何执行一个脚本,将用户输入的变量(如$ SERVER_URI)传递给nginx.conf和节点文件并覆盖当前数据

1 个答案:

答案 0 :(得分:0)

我建议创建一个配置文件并从中读取值,这样一切都将是动态的。

以下是如何动态实现SSL证书和其他ENV和端口的方法,也将获取和设置docker名称和图像名称。

  

创建文件docker.config ,其中包含端口,ENV,路径映射,主机值和链接(如果要链接容器)。把它们留空   如果你不需要它们。删除host_port:container_port此条目   仅供评论之用。

<强> docker.config

START_PORT_MAPPINGS
host_port:container_port
8080:80
END_PORT_MAPPINGS

START_PATH_MAPPINGS
/path_to_code/:/var/www/htlm/test
/path_to_nginx_config1:/etc/nginx/nginx.conf
/path_to_ssl_certs:/container_path_to_Certs
END_PATH_MAPPINGS

START_LINKING
db:db-server
END_LINKING

START_HOST_MAPPINGS
test.com:192.168.1.23
test2.com:192.168.1.23
END_HOST_MAPPINGS

START_ENV_VARS
MYSQL_ROOT_PASSWORD=1234
OTHER_ENV_VAR=value
END_ENV_VARS
  

创建start.sh 这将从 docker.config 中读取值,并运行命令您的docker容器。

需要两个参数1st:docker name和2nd:image name。

    function read_connfig() {

  docker_name="${1}"
  input="docker.config"


  option_key=$(echo "${2}" | cut -d':' -f1)
  config_name=$(echo "${2}" | cut -d':' -f2)
  post_fix=$(echo "${2}" | cut -d':' -f3)

  while IFS=$' \t\n\r' read -r line; do

    if [[ $line == END_"${config_name}" ]] ; then
        read_prop="no"
    fi

    if [[ $read_prop == "yes" ]] ; then
        echo -n "${option_key}${line}${post_fix} "
    fi

    if [[ $line == START_"${config_name}" ]] ; then
        read_prop="yes"
    fi
  done < "$input"

}
function get_run_configs() {
  docker_name=${1}
  declare -a configs=("-p :PORT_MAPPINGS:" "-v :PATH_MAPPINGS:" "--add-host=:HOST_MAPPINGS:" "-e :ENV_VARS:" "--link :LINKING:")
  local run_command=""

  for config in "${configs[@]}"
  do
    config_vals=($(read_connfig "${docker_name}" "${config}"))
    if [ !  -z  "${config_vals}" ];
    then
      for config_val in "${config_vals[@]}"
      do
        run_command="${run_command} ${config_val}"
      done
      else
        echo >&2 "No config found for ${config}"
    fi
  done
  echo "${run_command}"
}
container_name=$1;
image_name=$2
docker_command=$(get_run_configs $docker_name)
echo $docker_command
docker run --name $container_name $docker_command -dit $image_name

结果命令将是。 ./start.sh test test

docker run --name test  -p host_port:container_port -p 8080:80 -v /path_to_code/:/var/www/htlm/test -v /path_to_nginx_config1:/etc/nginx/nginx.conf -v /path_to_ssl_certs:/container_path_to_Certs --add-host=test.com:192.168.1.23 --add-host=test2.com:192.168.1.23 -e MYSQL_ROOT_PASSWORD=1234 -e OTHER_ENV_VAR=value --link db:db-server -dit test