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


Я предлагаю создать файл конфигурации и прочитать из него значение, чтобы все было динамически.
Вот как вы можете получить сертификат 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_portthis 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
да, но не этот скрипт, вы можете запустить этот скрипт с хоста, или вам нужен docker dind, тогда вам нужно скопировать скрипт в свой файл докера и запустить этот скрипт во время загрузки
Но как мне разрешить пользователю менять порт? Могу ли я (например) создать переменную $ PORT_TO_EXPOSED и разрешить пользователю вводить переменную в файл с помощью графического интерфейса (возможно?) С помощью скрипта node.js
Для каждого контейнера докеров создайте docker.config вместо env. Docker.config делает то же самое
Извините, но я не знаю, как пользователь может менять порты и т. д.
пользователю нужно будет только изменить docker.config, больше ничего
Спасибо ! Я предполагаю, что это работает, но могу ли я добавить скрипты в dockerfile, чтобы включить автоматическое выполнение скриптов при запуске изображения