Add Docker container name auto-detection to bootstrap UI
- Added DetectDockerContainerName() to detect container name from hostname - Extended /api/security/status to expose dockerContainerName field - Updated FirstRunSetup to show actual container name when detected: * Before: 'docker exec <container-name> cat /data/.bootstrap_token' * After: 'docker exec pulse cat /data/.bootstrap_token' This reduces friction for users - no need to look up the container name. Works when Docker container is named (--name flag), falls back to placeholder for auto-generated container IDs.
This commit is contained in:
parent
ae0481c982
commit
639635a84b
3 changed files with 38 additions and 2 deletions
|
|
@ -28,6 +28,7 @@ export const FirstRunSetup: Component<{ force?: boolean; showLegacyBanner?: bool
|
||||||
const [isDocker, setIsDocker] = createSignal<boolean>(false);
|
const [isDocker, setIsDocker] = createSignal<boolean>(false);
|
||||||
const [inContainer, setInContainer] = createSignal<boolean>(false);
|
const [inContainer, setInContainer] = createSignal<boolean>(false);
|
||||||
const [lxcCtid, setLxcCtid] = createSignal<string>('');
|
const [lxcCtid, setLxcCtid] = createSignal<string>('');
|
||||||
|
const [dockerContainerName, setDockerContainerName] = createSignal<string>('');
|
||||||
const [showAlternatives, setShowAlternatives] = createSignal(false);
|
const [showAlternatives, setShowAlternatives] = createSignal(false);
|
||||||
|
|
||||||
const applyTheme = (mode: 'system' | 'light' | 'dark') => {
|
const applyTheme = (mode: 'system' | 'light' | 'dark') => {
|
||||||
|
|
@ -77,6 +78,7 @@ export const FirstRunSetup: Component<{ force?: boolean; showLegacyBanner?: bool
|
||||||
setIsDocker(data.isDocker || false);
|
setIsDocker(data.isDocker || false);
|
||||||
setInContainer(data.inContainer || false);
|
setInContainer(data.inContainer || false);
|
||||||
setLxcCtid(data.lxcCtid || '');
|
setLxcCtid(data.lxcCtid || '');
|
||||||
|
setDockerContainerName(data.dockerContainerName || '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -336,10 +338,10 @@ IMPORTANT: Keep these credentials secure!
|
||||||
pct exec <ctid> -- cat {bootstrapTokenPath()}
|
pct exec <ctid> -- cat {bootstrapTokenPath()}
|
||||||
</Show>
|
</Show>
|
||||||
|
|
||||||
{/* Docker (generic) */}
|
{/* Docker (with detected name or placeholder) */}
|
||||||
<Show when={isDocker()}>
|
<Show when={isDocker()}>
|
||||||
<div class="text-blue-600 dark:text-blue-400 mb-1 font-semibold"># From Docker host:</div>
|
<div class="text-blue-600 dark:text-blue-400 mb-1 font-semibold"># From Docker host:</div>
|
||||||
docker exec <container-name> cat {bootstrapTokenPath()}
|
docker exec {dockerContainerName() || '<container-name>'} cat {bootstrapTokenPath()}
|
||||||
</Show>
|
</Show>
|
||||||
|
|
||||||
{/* Bare metal / inside container */}
|
{/* Bare metal / inside container */}
|
||||||
|
|
|
||||||
|
|
@ -490,6 +490,9 @@ func (r *Router) setupRoutes() {
|
||||||
if ctid := system.DetectLXCCTID(); ctid != "" {
|
if ctid := system.DetectLXCCTID(); ctid != "" {
|
||||||
status["lxcCtid"] = ctid
|
status["lxcCtid"] = ctid
|
||||||
}
|
}
|
||||||
|
if containerName := system.DetectDockerContainerName(); containerName != "" {
|
||||||
|
status["dockerContainerName"] = containerName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.config.DisableAuthEnvDetected {
|
if r.config.DisableAuthEnvDetected {
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,37 @@ func InContainer() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DetectDockerContainerName attempts to detect the Docker container name.
|
||||||
|
// Returns empty string if not in Docker or name cannot be determined.
|
||||||
|
func DetectDockerContainerName() string {
|
||||||
|
// Method 1: Check hostname (Docker uses container ID or name as hostname)
|
||||||
|
if hostname, err := os.Hostname(); err == nil && hostname != "" {
|
||||||
|
// Docker hostnames are either short container ID (12 chars) or custom name
|
||||||
|
// If it looks like a container ID (hex), skip it - user needs to use name
|
||||||
|
if !isHexString(hostname) || len(hostname) > 12 {
|
||||||
|
return hostname
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method 2: Try reading from /proc/self/cgroup
|
||||||
|
if data, err := os.ReadFile("/proc/self/cgroup"); err == nil {
|
||||||
|
// Look for patterns like: 0::/docker/<container-id>
|
||||||
|
// But we can't get name from cgroup, only ID
|
||||||
|
_ = data // placeholder for future enhancement
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func isHexString(s string) bool {
|
||||||
|
for _, c := range s {
|
||||||
|
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// DetectLXCCTID attempts to detect the Proxmox LXC container ID.
|
// DetectLXCCTID attempts to detect the Proxmox LXC container ID.
|
||||||
// Returns empty string if not in an LXC container or CTID cannot be determined.
|
// Returns empty string if not in an LXC container or CTID cannot be determined.
|
||||||
func DetectLXCCTID() string {
|
func DetectLXCCTID() string {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue