Как запустить nodejs и nginx с динамической опцией Docker?

Я новичок в node и nginx. Передо мной стоит задача создать простой веб-сервер, на котором размещается динамическое содержимое. Очень важной частью веб-сервера является получение информации от пользователя об используемых портах, любом используемом пользовательском домене (вместо localhost), сертификатах SSL и т. д. Из установщика [Предполагается, что он будет построен для докера], но я понятия не имею, как выполнить сценарий, который передает переменную, введенную пользователем (например, $ SERVER_URI), в nginx.conf и файл узла и перезаписывает текущие данные

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю создать файл конфигурации и прочитать из него значение, чтобы все было динамически.

Вот как вы можете получить сертификат SSL и другие ENV и порт динамически, а также имя докера и имя изображения будут получены и установлены.

Create file docker.config which contain ports, ENV, path mapping, hosts values and links if you wish to link container. leave them blank if you do not need them. remove host_port:container_port this entry just for comment purpose.

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

create start.sh this will read the values from docker.config and will run command your docker container.

Нужны два аргумента: 1-й: имя докера и 2-й: имя изображения.

    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

Спасибо ! Я предполагаю, что это работает, но могу ли я добавить скрипты в dockerfile, чтобы включить автоматическое выполнение скриптов при запуске изображения

Samyak Jha 30.03.2018 09:38

да, но не этот скрипт, вы можете запустить этот скрипт с хоста, или вам нужен docker dind, тогда вам нужно скопировать скрипт в свой файл докера и запустить этот скрипт во время загрузки

Adiii 30.03.2018 09:43

Но как мне разрешить пользователю менять порт? Могу ли я (например) создать переменную $ PORT_TO_EXPOSED и разрешить пользователю вводить переменную в файл с помощью графического интерфейса (возможно?) С помощью скрипта node.js

Samyak Jha 30.03.2018 09:47

Для каждого контейнера докеров создайте docker.config вместо env. Docker.config делает то же самое

Adiii 30.03.2018 09:50

Извините, но я не знаю, как пользователь может менять порты и т. д.

Samyak Jha 30.03.2018 09:52

пользователю нужно будет только изменить docker.config, больше ничего

Adiii 30.03.2018 09:57

Другие вопросы по теме