Привет, @WesPenre ![]()
Ошибка должна быть выше, чем показано на вашем скриншоте. Не могли бы вы скопировать сюда полный лог, чтобы другие могли понять, в чём проблема?
Привет, @WesPenre ![]()
Ошибка должна быть выше, чем показано на вашем скриншоте. Не могли бы вы скопировать сюда полный лог, чтобы другие могли понять, в чём проблема?
Может ли кто-нибудь, пожалуйста, подсказать, как создать файл журнала ошибок, если я не могу войти в систему Discourse? Можно ли найти его в WinSCP? Если да, то какая это папка и как называется файл журнала?
Это оно? Это файл запуска:
#!/usr/bin/env bash
usage () {
echo "Использование: launcher КОМАНДА КОНФИГ [--skip-prereqs] [--docker-args СТРОКА]"
echo "Команды:"
echo " start: Запуск/инициализация контейнера"
echo " stop: Остановка работающего контейнера"
echo " restart: Перезапуск контейнера"
echo " destroy: Остановка и удаление контейнера"
echo " enter: Открыть оболочку для выполнения команд внутри контейнера"
echo " logs: Просмотр логов Docker для контейнера"
echo " bootstrap: Инициализация контейнера для конфигурации на основе шаблона"
echo " run: Выполнение заданной команды с конфигурацией в контексте последнего образа для инициализации"
echo " rebuild: Пересборка контейнера (удаление старого, инициализация, запуск нового)"
echo " cleanup: Удаление всех контейнеров, остановленных более 24 часов назад"
echo " start-cmd: Генерация команды Docker, используемой для запуска контейнера"
echo
echo "Опции:"
echo " --skip-prereqs Не проверять предварительные требования запуска"
echo " --docker-args Дополнительные аргументы для передачи при запуске docker"
echo " --skip-mac-address Не назначать MAC-адрес"
echo " --run-image Переопределить образ, используемый для запуска контейнера"
exit 1
}
# для возможного повторного выполнения позже
SAVED_ARGV=("$@")
command=$1
config=$2
# user_args_argv присваивается один раз при разборе вектора аргументов.
user_args_argv=""
# user_args изменяемый: его значение может измениться при разборе шаблонов.
# Надмножество user_args_argv.
user_args=""
user_run_image=""
if [[ $command == "run" ]]; then
run_command=$3
fi
while [ ${#} -gt 0 ]; do
case "${1}" in
--debug)
DEBUG="1"
;;
--skip-prereqs)
SKIP_PREREQS="1"
;;
--skip-mac-address)
SKIP_MAC_ADDRESS="1"
;;
--docker-args)
user_args_argv="$2"
user_args="$user_args_argv"
shift
;;
--run-image)
user_run_image="$2"
shift
;;
esac
shift 1
done
if [ -z "$command" -o -z "$config" -a "$command" != "cleanup" ]; then
usage
fi
# Docker не любит заглавные буквы, пробелы или специальные символы, отловим это сейчас, прежде чем собирать всё и обнаруживать проблему
re='[[:upper:]/ !@#$%^&*()+~`=]'
if [[ $config =~ $re ]];
then
echo
echo "ОШИБКА: Имя конфигурации '$config' не должно содержать заглавных букв, пробелов или специальных символов. Исправьте имя конфигурации и запустите $0 заново."
echo
exit 1
fi
cd "$(dirname "$0")"
pups_version='v1.0.3'
docker_min_version='17.03.1'
docker_rec_version='17.06.2'
git_min_version='1.8.0'
git_rec_version='1.8.0'
kernel_min_version='4.4.0'
config_file=containers/"$config".yml
cidbootstrap=cids/"$config"_bootstrap.cid
local_discourse=local_discourse
image="discourse/base:2.0.20230217-0055"
image_stable="discourse/base:2.0.20230116-0051"
docker_path=`which docker.io 2> /dev/null || which docker`
git_path=`which git`
if [ "${SUPERVISED}" = "true" ]; then
restart_policy="--restart=no"
attach_on_start="-a"
attach_on_run="-a stdout -a stderr"
else
attach_on_run="-d"
fi
if [ -n "$DOCKER_HOST" ]; then
docker_ip=`sed -e 's/^tcp:\/\/\(.*\):.*$/\1/' <<< "$DOCKER_HOST"`
elif [ -x "$(which ip 2>/dev/null)" ]; then
docker_ip=`ip addr show docker0 | \
grep 'inet ' | \
awk '{ split($2,a,"/"); print a[1] }';`
else
docker_ip=`ifconfig | \
grep -B1 "inet addr" | \
awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
grep docker0 | \
awk -F: '{ print $3 }';`
fi
# Из https://stackoverflow.com/a/44660519/702738
compare_version() {
if [[ $1 == $2 ]]; then
return 1
fi
local IFS=.
local i a=(${1%%[^0-9.]*}) b=(${2%%[^0-9.]*})
local arem=${1#${1%%[^0-9.]*}} brem=${2#${2%%[^0-9.]*}}
for ((i=0; i<${#a[@]} || i<${#b[@]}; i++)); do
if ((10#${a[i]:-0} < 10#${b[i]:-0})); then
return 1
elif ((10#${a[i]:-0} > 10#${b[i]:-0})); then
return 0
fi
done
if [ "$arem" '<' "$brem" ]; then
return 1
elif [ "$arem" '>' "$brem" ]; then
return 0
fi
return 1
}
fatal () {
echo -e "\n$1\n"
exit "${2:-1}"
}
install_docker() {
echo "Docker не установлен, вам потребуется установить Docker для запуска Launchpad"
echo "Смотрите https://docs.docker.com/installation/"
exit 1
}
pull_image() {
# Добавляем одну повторную попытку для обхода ошибок TLS в dockerhub
$docker_path pull $image || $docker_path pull $image
}
check_prereqs() {
if [ -z $docker_path ]; then
install_docker
fi
# 1. запущен ли демон docker?
# отправляем stderr в /dev/null, так как нас не интересуют предупреждения,
# обычно он жалуется на swap, что не имеет значения
test=`$docker_path info 2> /dev/null`
if [[ $? -ne 0 ]] ; then
echo "Не удалось подключиться к демону docker - проверьте, что он запущен, и у вас есть доступ"
exit 1
fi
# 2. используется ли одобренный драйвер хранения?
if ! $docker_path info 2> /dev/null | egrep -q 'Storage Driver: (btrfs|aufs|zfs|overlay2)$'; then
echo "Ваша установка Docker не использует поддерживаемый драйвер хранения. Если мы продолжим, установка может оказаться неработоспособной."
echo "overlay2 — рекомендуемый драйвер хранения, хотя zfs и aufs также могут работать."
echo "Известно, что другие драйверы хранения вызывают проблемы."
echo "Вы можете узнать, какую файловую систему используете, запустив \"docker info\" и посмотрев на строку 'Storage Driver'."
echo
echo "Если вы всё же хотите продолжить, используя свой существующий неподдерживаемый драйвер хранения,"
echo "изучите исходный код launchpad и выясните, как обойти эту проверку."
exit 1
fi
# 3. запущена ли рекомендуемая версия docker
test=($($docker_path --version)) # Получить строку версии docker
test=${test[2]//,/} # Получить только версию и убрать запятую, если она есть
# По крайней мере минимальная версия docker
if compare_version "${docker_min_version}" "${test}"; then
echo "ОШИБКА: Версия Docker ${test} не поддерживается, пожалуйста, обновитесь хотя бы до ${docker_min_version}, или рекомендуется ${docker_rec_version}"
exit 1
fi
# Рекомендуется более новая версия docker
if compare_version "${docker_rec_version}" "${test}"; then
echo "ПРЕДУПРЕЖДЕНИЕ: Версия Docker ${test} устарела, рекомендуется обновиться до ${docker_rec_version} или новее."
fi
arm=false
case $(uname -m) in
armv7l)
echo "ОШИБКА: 32-битная ARM не поддерживается. Проверьте, поддерживает ли ваше оборудование arm64, которое поддерживается в экспериментальном режиме."
exit 1
;;
aarch64 | arm64)
echo "ПРЕДУПРЕЖДЕНИЕ: Поддержка aarch64 в данный момент экспериментальная. Пожалуйста, сообщайте о любых проблемах на https://meta.discourse.org/tag/arm"
image="discourse/base:aarch64"
arm=true
;;
x86_64)
echo "Обнаружена архитектура x86_64."
;;
*)
echo "ОШИБКА: обнаружена неизвестная архитектура."
exit 1
;;
esac
# 4. образ docker discourse загружен
test=`$docker_path images | awk '{print $1 ":" $2 }' | grep "$image"`
# экспериментальная поддержка arm на фиксированном теге, всегда обновляем
if [ -z "$test" ] || [ $arm = true ]; then
echo
echo "ПРЕДУПРЕЖДЕНИЕ: Мы собираемся начать загрузку базового образа Discourse"
echo "Этот процесс может занять от нескольких минут до часа в зависимости от скорости вашей сети"
echo
echo "Пожалуйста, наберитесь терпения"
echo
pull_image
fi
# используем более старый образ для стабильной версии
version=$(cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['params']['version']")
if [ "$version" = "stable" ]; then
image=$image_stable
pull_image
fi
# 5. запущена ли рекомендуемая версия git
test=($($git_path --version)) # Получить строку версии git
test=${test[2]//,/} # Получить только версию и убрать запятую, если она есть
# По крайней мере минимальная версия
if compare_version "${git_min_version}" "${test}"; then
echo "ОШИБКА: Версия Git ${test} не поддерживается, пожалуйста, обновитесь хотя бы до ${git_min_version}, или рекомендуется ${git_rec_version}"
exit 1
fi
# Рекомендуется лучшая версия
if compare_version "${git_rec_version}" "${test}"; then
echo "ПРЕДУПРЕЖДЕНИЕ: Версия Git ${test} устарела, рекомендуется обновиться до ${git_rec_version} или новее."
fi
# Проверка минимальной версии ядра из-за https://bugs.ruby-lang.org/issues/13885
test=($(uname -r))
# По крайней мере минимальная версия
if compare_version "${kernel_min_version}" "${test}"; then
echo "ОШИБКА: Версия ядра ${test} не поддерживается, пожалуйста, обновитесь хотя бы до ${kernel_min_version}"
exit 1
fi
# 6. возможно ли присоединить stderr / stdout / tty
test=`$docker_path run $user_args -i --rm -a stdout -a stderr $image echo working`
if [[ "$test" =~ "working" ]] ; then : ; else
echo "Ваша установка Docker работает некорректно"
echo
echo "Смотрите: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
exit 1
fi
# 7. достаточно ли места для инициализации в папке docker
folder=`$docker_path info --format '{{.DockerRootDir}}'`
safe_folder=${folder:-/var/lib/docker}
if [[ -d $safe_folder && $(stat -f --format="%a*%S" $safe_folder)/1024**3 -lt 5 ]] ; then
echo "У вас менее 5 ГБ свободного места на диске, где находится $safe_folder. Вам потребуется больше места для продолжения"
df -h $safe_folder
echo
if tty >/dev/null; then
read -p "Хотите ли вы попытаться освободить место, очистив образы и контейнеры docker в системе? (y/N)" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
$docker_path container prune --force --filter until=24h >/dev/null
$docker_path image prune --all --force --filter until=24h >/dev/null
echo "Если очистка прошла успешно, вы можете попробовать снова"
fi
fi
exit 1
fi
# 8. файл определения контейнера доступен и не является небезопасным (доступным для чтения всеми)
if [[ ! -e "$config_file" || ! -r "$config_file" ]]; then
echo "ОШИБКА: $config_file не существует или недоступен для чтения."
echo
echo "Доступные конфигурации ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
exit 1
elif [[ "$(find $config_file -perm -004)" ]]; then
echo "ПРЕДУПРЕЖДЕНИЕ: файл $config_file доступен для чтения всеми. Вы можете защитить этот файл, выполнив: chmod o-rwx $config_file"
fi
}
if [ -z "$SKIP_PREREQS" ] && [ "$command" != "cleanup" ]; then
check_prereqs
fi
set_volumes() {
volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
}
set_links() {
links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
}
find_templates() {
local templates=`cat $1 | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
local arrTemplates=${templates// / }
if [ ! -z "$templates" ]; then
echo $templates
else
echo ""
fi
}
set_template_info() {
templates=$(find_templates $config_file)
arrTemplates=(${templates// / })
config_data=$(cat $config_file)
input="hack: true"
for template in "${arrTemplates[@]}"
do
[ ! -z $template ] && {
input="$input _FILE_SEPERATOR_ $(cat $template)"
}
done
# мы всегда хотим, чтобы наш файл конфигурации был последним, чтобы он имел приоритет
input="$input _FILE_SEPERATOR_ $config_data"
read -r -d '' env_ruby << 'RUBY'
require 'yaml'
input=STDIN.readlines.join
# по умолчанию UTF-8 ради баз данных
env = {'LANG' => 'en_US.UTF-8'}
input.split('_FILE_SEPERATOR_').each do |yml|
yml.strip!
begin
env.merge!(YAML.load(yml)['env'] || {})
rescue Psych::SyntaxError => e
puts e
puts "*ОШИБКА."
rescue => e
puts yml
p e
end
end
env.each{|k,v| puts "*ОШИБКА." if v.is_a?(Hash)}
puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
RUBY
tmp_input_file=$(mktemp)
echo "$input" > "$tmp_input_file"
raw=`exec cat "$tmp_input_file" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
rm -f "$tmp_input_file"
env=()
ok=1
while read i; do
if [ "$i" == "*ОШИБКА." ]; then
ok=0
elif [ -n "$i" ]; then
env[${#env[@]}]="${i//\{\{config\}\}/${config}}"
fi
done <<< "$raw"
if [ "$ok" -ne 1 ]; then
echo "${env[@]}"
echo "Синтаксическая ошибка YAML. Пожалуйста, проверьте ваши файлы конфигурации containers/*.yml."
exit 1
fi
# метки
read -r -d '' labels_ruby << 'RUBY'
require 'yaml'
input=STDIN.readlines.join
labels = {}
input.split('_FILE_SEPERATOR_').each do |yml|
yml.strip!
begin
labels.merge!(YAML.load(yml)['labels'] || {})
rescue Psych::SyntaxError => e
puts e
puts "*ОШИБКА."
rescue => e
puts yml
p e
end
end
puts labels.map{|k,v| "-l\n#{k}=#{v}" }.join("\n")
RUBY
tmp_input_file=$(mktemp)
echo "$input" > "$tmp_input_file"
raw=`exec cat "$tmp_input_file" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$labels_ruby"`
rm -f "$tmp_input_file"
labels=()
ok=1
while read i; do
if [ "$i" == "*ОШИБКА." ]; then
ok=0
elif [ -n "$i" ]; then
labels[${#labels[@]}]=$(echo $i | sed s/{{config}}/${config}/g)
fi
done <<< "$raw"
if [ "$ok" -ne 1 ]; then
echo "${labels[@]}"
echo "Синтаксическая ошибка YAML. Пожалуйста, проверьте ваши файлы конфигурации containers/*.yml."
exit 1
fi
# expose
read -r -d '' ports_ruby << 'RUBY'
require 'yaml'
input=STDIN.readlines.join
ports = []
input.split('_FILE_SEPERATOR_').each do |yml|
yml.strip!
begin
ports += (YAML.load(yml)['expose'] || [])
rescue Psych::SyntaxError => e
puts e
puts "*ОШИБКА."
rescue => e
puts yml
p e
end
end
puts ports.map { |p| p.to_s.include?(':') ? "-p\n#{p}" : "--expose\n#{p}" }.join("\n")
RUBY
tmp_input_file=$(mktemp)
echo "$input" > "$tmp_input_file"
raw=`exec cat "$tmp_input_file" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$ports_ruby"`
rm -f "$tmp_input_file"
ports=()
ok=1
while read i; do
if [ "$i" == "*ОШИБКА." ]; then
ok=0
elif [ -n "$i" ]; then
ports[${#ports[@]}]=$i
fi
done <<< "$raw"
if [ "$ok" -ne 1 ]; then
echo "${ports[@]}"
echo "Синтаксическая ошибка YAML. Пожалуйста, проверьте ваши файлы конфигурации containers/*.yml."
exit 1
fi
merge_user_args
}
if [ -z $docker_path ]; then
install_docker
fi
[ "$command" == "cleanup" ] && {
$docker_path container prune --filter until=1h
$docker_path image prune --all --filter until=1h
if [ -d /var/discourse/shared/standalone/postgres_data_old ]; then
echo
echo "Обнаружен старый кластер данных резервной копии PostgreSQL, занимающий $(du -hs /var/discourse/shared/standalone/postgres_data_old | awk '{print $1}')"
read -p "Хотите ли вы удалить его? (y/N): " -n 1 -r && echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "удаление старого кластера данных PostgreSQL в /var/discourse/shared/standalone/postgres_data_old..."
rm -rf /var/discourse/shared/standalone/postgres_data_old*
else
exit 1
fi
fi
exit 0
}
docker_version=($($docker_path --version))
docker_version=${test[2]//,/}
restart_policy=${restart_policy:---restart=always}
set_existing_container(){
existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
}
run_stop() {
set_existing_container
if [ ! -z $existing ]
then
(
set -x
$docker_path stop -t 30 $config
)
else
echo "$config не был запущен!"
echo "./discourse-doctor может помочь в диагностике проблемы."
exit 1
fi
}
set_run_image() {
run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`
if [ -n "$user_run_image" ]; then
run_image=$user_run_image
elif [ -z "$run_image" ]; then
run_image="$local_discourse/$config"
fi
}
set_boot_command() {
boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['boot_command']"`
if [ -z "$boot_command" ]; then
no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`
if [ -z "$no_boot_command" ]; then
boot_command="/sbin/boot"
fi
fi
}
merge_user_args() {
local docker_args
docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
if [[ -n "$docker_args" ]]; then
user_args="$user_args_argv $docker_args"
fi
}
run_start() {
if [ -z "$START_CMD_ONLY" ]
then
existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
echo $existing
if [ ! -z $existing ]
then
echo "Нечего делать, ваш контейнер уже запущен!"
exit 0
fi
existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
if [ ! -z $existing ]
then
echo "запуск существующего контейнера"
(
set -x
$docker_path start $config
)
exit 0
fi
fi
set_template_info
set_volumes
set_links
set_run_image
set_boot_command
# получить имя хоста и настройки из конфигурации контейнера
for envar in "${env[@]}"
do
if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
then
# использовать как переменную окружения
eval $envar
fi
done
(
hostname=`hostname -s`
# переопределить имя хоста
if [ "$DOCKER_USE_HOSTNAME" = "true" ]
then
hostname=$DISCOURSE_HOSTNAME
else
hostname=$hostname-$config
fi
# нужно нормализовать, чтобы остались только допустимые строки, это более полно, но посмотрим, как справится bash
# hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
# docker добавил больше правил для имени хоста
hostname=${hostname//_/-}
if [ -z "$SKIP_MAC_ADDRESS" ] ; then
mac_address="--mac-address $($docker_path run $user_args -i --rm -a stdout -a stderr $image /bin/sh -c "echo $hostname | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'")"
fi
if [ ! -z "$START_CMD_ONLY" ] ; then
docker_path="true"
fi
set -x
$docker_path run --shm-size=512m $links $attach_on_run $restart_policy "${env[@]}" "${labels[@]}" -h "$hostname" \
-e DOCKER_HOST_IP="$docker_ip" --name $config -t "${ports[@]}" $volumes $mac_address $user_args \
$run_image $boot_command
)
exit 0
}
run_run() {
set_template_info
set_volumes
set_links
set_run_image
unset ERR
(exec $docker_path run --rm --shm-size=512m $user_args $links "${env[@]}" -e DOCKER_HOST_IP="$docker_ip" -i -a stdin -a stdout -a stderr $volumes $run_image \
/bin/bash -c "$run_command") || ERR=$?
if [[ $ERR > 0 ]]; then
exit 1
fi
}
run_bootstrap() {
set_template_info
base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
"require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
if [[ ! X"" = X"$base_image" ]]; then
image=$base_image
fi
# базовый образ не всегда может быть discourse/base,
# давайте убедимся, что мы всегда собираем из последней версии
pull_image
set_volumes
set_links
if $docker_path run $user_args --rm -i $image gem which pups; then
pups_command="/usr/local/bin/pups --stdin"
else
# Возврат к методу git pull здесь, если `pups` не был установлен через gem в базовом образе
pups_command="cd /pups &&"
if [[ ! "false" = $update_pups ]]; then
pups_command="$pups_command git pull && git checkout $pups_version &&"
fi
pups_command="$pups_command /pups/bin/pups --stdin"
fi
echo $pups_command
declare -i BOOTSTRAP_EXITCODE
rm -f $cidbootstrap
echo "$input" | $docker_path run --shm-size=512m $user_args $links "${env[@]}" -e DOCKER_HOST_IP="$docker_ip" --cidfile "$cidbootstrap" -i -a stdin -a stdout -a stderr $volumes $image \
/bin/bash -c "$pups_command"
BOOTSTRAP_EXITCODE=$?
CONTAINER_ID=$(cat "$cidbootstrap")
rm -f "$cidbootstrap"
# магический код выхода, указывающий на повторную попытку
if [[ $BOOTSTRAP_EXITCODE -eq 77 ]]; then
$docker_path rm "$CONTAINER_ID"
exit 77
elif [[ $BOOTSTRAP_EXITCODE -gt 0 ]]; then
echo "инициализация завершена с кодом выхода $BOOTSTRAP_EXITCODE"
echo "** НЕ УДАЛОСЬ ИНИЦИАЛИЗИРОВАТЬ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько."
echo "./discourse-doctor может помочь в диагностике проблемы."
if [[ -n "$DEBUG" ]]; then
if $docker_path commit "$CONTAINER_ID" $local_discourse/$config-debug; then
echo "** ОТЛАДКА ** Сохранение образа для диагностики $local_discourse/$config-debug"
else
echo "** ОТЛАДКА ** Не удалось закоммитить контейнер $CONTAINER_ID для диагностики"
fi
fi
$docker_path rm "$CONTAINER_ID"
exit 1
fi
sleep 5
$docker_path commit \
-c "LABEL org.opencontainers.image.created=\"$(TZ=UTC date -Iseconds)\"" \
"$CONTAINER_ID" \
$local_discourse/$config || fatal "НЕ УДАЛОСЬ ЗАКОММИТИТЬ $CONTAINER_ID"
$docker_path rm "$CONTAINER_ID"
}
case "$command" in
bootstrap)
run_bootstrap
echo "Успешная инициализация, для запуска используйте ./launcher start $config"
exit 0
;;
run)
run_run
exit 0
;;
enter)
exec $docker_path exec -it $config /bin/bash --login
;;
stop)
run_stop
exit 0
;;
logs)
$docker_path logs $config
exit 0
;;
restart)
run_stop
run_start
exit 0
;;
start-cmd)
START_CMD_ONLY="1"
run_start
exit 0;
;;
start)
run_start
exit 0
;;
rebuild)
if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
fi
if [ "$(git symbolic-ref --short HEAD)" == "main" ]; then
echo "Обеспечение актуальности launchpad"
git remote update
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse @{u})
BASE=$(git merge-base HEAD @{u})
if [ $LOCAL = $REMOTE ]; then
echo "Launchpad актуален"
elif [ $LOCAL = $BASE ]; then
echo "Обновление Launchpad..."
git pull || (echo 'не удалось обновить' && exit 1)
echo "Launchpad обновлен, перезапуск..."
exec "$0" "${SAVED_ARGV[@]}"
elif [ $REMOTE = $BASE ]; then
echo "Ваша версия Launchpad опережает origin"
else
echo "Launchpad разошелся с исходным кодом, это ожидается только в режиме Dev"
fi
fi
set_existing_container
if [ ! -z $existing ]
then
echo "Остановка старого контейнера"
(
set -x
$docker_path stop -t 60 $config
)
fi
run_bootstrap
if [ ! -z $existing ]
then
echo "Удаление старого контейнера"
(
set -x
$docker_path rm $config
)
fi
run_start
exit 0
;;
destroy)
(set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config не найден" && exit 0)
exit 0
;;
esac
usage
Чтобы закрыть этот вопрос, небольшая помощь от PM показала, что проблема была в MaxMind, и закомментирование этого позволило загрузке завершиться успешно. ![]()