Add Avorion Pterodactyl compatibility image
Some checks failed
Build and Publish Docker Image / docker (push) Failing after 2m22s
Some checks failed
Build and Publish Docker Image / docker (push) Failing after 2m22s
This commit is contained in:
42
.github/workflows/docker-publish.yml
vendored
Normal file
42
.github/workflows/docker-publish.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Build and Publish Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
tags: [ "v*" ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Log in to GHCR
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ghcr.io/${{ github.repository_owner }}/avorion-steamcmd-nsswrap
|
||||
tags: |
|
||||
type=raw,value=latest
|
||||
type=ref,event=tag
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
11
Dockerfile
Normal file
11
Dockerfile
Normal file
@@ -0,0 +1,11 @@
|
||||
FROM ghcr.io/ptero-eggs/steamcmd:debian
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends libnss-wrapper \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
WORKDIR /home/container
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
62
README.md
Normal file
62
README.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# Avorion Pterodactyl Compatibility Image
|
||||
|
||||
This is a thin wrapper image for the Avorion egg that keeps behavior as close as possible to the original `ghcr.io/ptero-eggs/steamcmd:debian` image while fixing Avorion's `getpwuid(getuid()) returned NULL` startup failure.
|
||||
|
||||
## What this fixes
|
||||
|
||||
Avorion expects the current runtime UID inside the container to resolve to a valid user entry with a home directory. On some Pterodactyl setups, the server process runs as a UID that does not exist in `/etc/passwd` inside the image. When that happens, Avorion can crash on startup with:
|
||||
|
||||
- `Error finding home directory: getpwuid(getuid()) returned NULL`
|
||||
- `Could not find a suitable directory for saving files`
|
||||
|
||||
This image adds a temporary passwd/group entry at startup using `libnss-wrapper`, while keeping the rest of the egg behavior nearly unchanged.
|
||||
|
||||
## Build and publish
|
||||
|
||||
Replace `YOUR_GHCR_USER` with your GitHub Container Registry namespace.
|
||||
|
||||
```bash
|
||||
docker build -t ghcr.io/YOUR_GHCR_USER/avorion-steamcmd-nsswrap:latest .
|
||||
docker push ghcr.io/YOUR_GHCR_USER/avorion-steamcmd-nsswrap:latest
|
||||
```
|
||||
|
||||
## Egg changes
|
||||
|
||||
In your Avorion egg JSON, change only the Docker image entry.
|
||||
|
||||
From:
|
||||
|
||||
```json
|
||||
"docker_images": {
|
||||
"ghcr.io/ptero-eggs/steamcmd:debian": "ghcr.io/ptero-eggs/steamcmd:debian"
|
||||
}
|
||||
```
|
||||
|
||||
To something like:
|
||||
|
||||
```json
|
||||
"docker_images": {
|
||||
"ghcr.io/YOUR_GHCR_USER/avorion-steamcmd-nsswrap:latest": "ghcr.io/YOUR_GHCR_USER/avorion-steamcmd-nsswrap:latest"
|
||||
}
|
||||
```
|
||||
|
||||
You can leave the install script alone for the first test.
|
||||
|
||||
## Recommended startup command
|
||||
|
||||
Start with the most conservative startup possible so you are only testing the image fix:
|
||||
|
||||
```bash
|
||||
export HOME=/home/container; mkdir -p "/home/container/galaxy/{{GALAXY_NAME}}/moddata/ConfigLib"; exec ./bin/AvorionServer --galaxy-name "{{GALAXY_NAME}}" --admin "{{ADMIN_ID}}" --datapath galaxy --port "{{SERVER_PORT}}" --query-port "{{QUERY_PORT}}" --steam-master-port "{{STEAM_MASTER_PORT}}" --steam-query-port "{{STEAM_QUERY_PORT}}" --max-players "{{MAX_PLAYERS}}" --difficulty "{{DIFFICULTY}}" --collision-damage "{{COLLISION_DMG}}" --save-interval "{{SAVE_INTERVAL}}" --same-start-sector "{{SAME_START_SECTOR}}" --server-name "{{SERVER_NAME}}" --threads "{{GAME_THREADS}}" --listed "{{SERVER_LISTED}}"
|
||||
```
|
||||
|
||||
## Suggested rollout steps
|
||||
|
||||
1. Add `Dockerfile` and `entrypoint.sh` to a new Git repo.
|
||||
2. Build and push the image to GHCR.
|
||||
3. Update only the egg's Docker image reference.
|
||||
4. Leave the install script unchanged.
|
||||
5. Use the conservative startup command above.
|
||||
6. Reinstall or rebuild the server container if needed so it pulls the new image.
|
||||
7. Start the server and confirm the Avorion home-directory error is gone.
|
||||
8. Only after it boots cleanly, revisit `--datapath`, symlinks, or mod path adjustments.
|
||||
40
entrypoint.sh
Executable file
40
entrypoint.sh
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
export USER=container
|
||||
export HOME=/home/container
|
||||
mkdir -p /home/container /tmp
|
||||
|
||||
uid="$(id -u)"
|
||||
gid="$(id -g)"
|
||||
|
||||
PASSWD_FILE="/tmp/passwd"
|
||||
GROUP_FILE="/tmp/group"
|
||||
|
||||
cp /etc/passwd "$PASSWD_FILE"
|
||||
cp /etc/group "$GROUP_FILE"
|
||||
|
||||
if ! getent passwd "$uid" >/dev/null 2>&1; then
|
||||
echo "container:x:${uid}:${gid}::/home/container:/bin/bash" >> "$PASSWD_FILE"
|
||||
fi
|
||||
|
||||
if ! getent group "$gid" >/dev/null 2>&1; then
|
||||
echo "container:x:${gid}:" >> "$GROUP_FILE"
|
||||
fi
|
||||
|
||||
export NSS_WRAPPER_PASSWD="$PASSWD_FILE"
|
||||
export NSS_WRAPPER_GROUP="$GROUP_FILE"
|
||||
|
||||
libnss="$(find /usr/lib /lib -name 'libnss_wrapper.so' 2>/dev/null | head -n 1 || true)"
|
||||
if [ -n "$libnss" ]; then
|
||||
export LD_PRELOAD="${libnss}${LD_PRELOAD:+:${LD_PRELOAD}}"
|
||||
fi
|
||||
|
||||
cd /home/container
|
||||
|
||||
if [ -n "${STARTUP:-}" ]; then
|
||||
echo ":/home/container$ ${STARTUP}"
|
||||
exec /bin/bash -c "${STARTUP}"
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
Reference in New Issue
Block a user