Fix setlocale: LC_ALL: cannot change locale (en_US.UTF-8) in Proxmox LXC
Context
During the execution of Ultimate Updater on a Proxmox VE host, several LXC containers produced the warning:
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
This happens when:
LANG=en_US.UTF-8orLC_ALL=en_US.UTF-8is configured- but the locale has not been generated inside the container.
Typical symptoms:
locale -a
C
C.utf8
POSIX
The container tries to use en_US.UTF-8 but it does not exist yet.
Affected Containers
The following LXC containers were detected in logs:
VMID Name
21211434 ollama-lxc 21302002 wireshark 21808501 subsai 22101900 cast-relay 22202000 dev-vscodium
Solution
The solution is to:
- Install locale packages
- Generate the
en_US.UTF-8locale - Set system environment variables
- Apply the fix across all containers automatically
Automated Fix Script (Run on Proxmox Host)
for CT in 21211434 21302002 21808501 22101900 22202000; do
echo "===== CT $CT ====="
WAS_RUNNING=0
if [ "$(pct status "$CT" | awk '{print $2}')" = "running" ]; then
WAS_RUNNING=1
else
pct start "$CT"
sleep 3
fi
pct exec "$CT" -- bash -lc 'apt update && apt install -y locales'
pct exec "$CT" -- bash -lc '
grep -q "^en_US.UTF-8 UTF-8" /etc/locale.gen ||
sed -i "s/^# *en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" /etc/locale.gen ||
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
'
pct exec "$CT" -- bash -lc 'locale-gen en_US.UTF-8'
pct exec "$CT" -- bash -lc '
update-locale LANG=en_US.UTF-8 LANGUAGE=en_US LC_ALL=en_US.UTF-8
'
pct exec "$CT" -- bash -lc '
printf "LANG=en_US.UTF-8\nLANGUAGE=en_US\nLC_ALL=en_US.UTF-8\n" > /etc/environment
'
pct exec "$CT" -- bash -lc 'locale'
if [ "$WAS_RUNNING" -eq 0 ]; then
pct stop "$CT"
fi
done
Behavior of the script:
- If the container is already running, it remains running.
- If the container was stopped, it is temporarily started, fixed, then stopped again.
Verification Script
After applying the fix:
for CT in 21211434 21302002 21808501 22101900 22202000; do
echo "===== CT $CT ====="
WAS_RUNNING=0
if [ "$(pct status "$CT" | awk '{print $2}')" = "running" ]; then
WAS_RUNNING=1
else
pct start "$CT"
sleep 3
fi
pct exec "$CT" -- bash -lc 'locale; echo; locale -a | grep -i en_US'
if [ "$WAS_RUNNING" -eq 0 ]; then
pct stop "$CT"
fi
done
Expected output:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
...
en_US.utf8
Log Verification
To confirm that Ultimate Updater no longer reports the warning:
grep -in "setlocale" /var/log/ultimate-updater.log
The warning should no longer appear for these containers.
Notes
- The warning may still appear during the fix execution, because the old environment is still loaded.
- After
locale-genandupdate-locale, the system configuration is correct. - The fix is persistent and survives container reboot.
Result
All containers now correctly use:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
Locale list:
locale -a
en_US.utf8
The Proxmox update process runs without locale warnings.
Description