From cd6b94986888030898f126fc1ce1ff977c80a82b Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 24 Apr 2022 18:10:20 +0300 Subject: [PATCH 01/12] fix: invalid INTERNAL_IP environment value New IP route output appends UID to the result, causing the value to be set to that instead of the IP. Fix it by ignoring the last two appended UID results --- bot/bastion/entrypoint.sh | 5 +++-- bot/parkertron/entrypoint.sh | 5 +++-- bot/red/entrypoint.sh | 7 ++++--- bot/sinusbot/entrypoint.sh | 5 +++-- cassandra/entrypoint.sh | 2 +- dotnet/entrypoint.sh | 5 +++-- erlang/entrypoint.sh | 2 +- games/altv/entrypoint.sh | 7 ++++--- games/arma3/entrypoint.sh | 27 ++++++++++++++++----------- games/source/entrypoint.sh | 2 +- go/entrypoint.sh | 4 ++-- java/entrypoint.sh | 2 +- mariadb/entrypoint.sh | 3 ++- mongodb/entrypoint.sh | 3 ++- mono/entrypoint.sh | 3 ++- nodejs/entrypoint.sh | 3 ++- oses/alpine/entrypoint.sh | 4 ++-- oses/debian/entrypoint.sh | 7 ++++--- oses/ubuntu/entrypoint.sh | 5 +++-- postgres/entrypoint.sh | 3 ++- python/entrypoint.sh | 3 ++- redis/entrypoint.sh | 3 ++- rust/entrypoint.sh | 3 ++- voice/teaspeak/entrypoint.sh | 2 +- wine/entrypoint.sh | 3 ++- 25 files changed, 70 insertions(+), 48 deletions(-) diff --git a/bot/bastion/entrypoint.sh b/bot/bastion/entrypoint.sh index 06c0ce9..d5bdcc7 100644 --- a/bot/bastion/entrypoint.sh +++ b/bot/bastion/entrypoint.sh @@ -1,8 +1,9 @@ #!/bin/bash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e $(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')) diff --git a/bot/parkertron/entrypoint.sh b/bot/parkertron/entrypoint.sh index c39e96c..1971986 100644 --- a/bot/parkertron/entrypoint.sh +++ b/bot/parkertron/entrypoint.sh @@ -1,8 +1,9 @@ #!/bin/ash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')` diff --git a/bot/red/entrypoint.sh b/bot/red/entrypoint.sh index cdb1fd1..d5bdcc7 100644 --- a/bot/red/entrypoint.sh +++ b/bot/red/entrypoint.sh @@ -1,12 +1,13 @@ #!/bin/bash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e $(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')) echo -e ":/home/container$ ${MODIFIED_STARTUP}" # Run the Server -eval ${MODIFIED_STARTUP} \ No newline at end of file +eval ${MODIFIED_STARTUP} diff --git a/bot/sinusbot/entrypoint.sh b/bot/sinusbot/entrypoint.sh index 33e5ddc..d0aea75 100644 --- a/bot/sinusbot/entrypoint.sh +++ b/bot/sinusbot/entrypoint.sh @@ -1,8 +1,9 @@ #!/bin/bash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')` diff --git a/cassandra/entrypoint.sh b/cassandra/entrypoint.sh index 3df1092..2541719 100644 --- a/cassandra/entrypoint.sh +++ b/cassandra/entrypoint.sh @@ -5,7 +5,7 @@ TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/dotnet/entrypoint.sh b/dotnet/entrypoint.sh index 13d9e20..11acd70 100644 --- a/dotnet/entrypoint.sh +++ b/dotnet/entrypoint.sh @@ -1,8 +1,9 @@ #!/bin/bash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') diff --git a/erlang/entrypoint.sh b/erlang/entrypoint.sh index 6875d24..7511c57 100644 --- a/erlang/entrypoint.sh +++ b/erlang/entrypoint.sh @@ -3,7 +3,7 @@ TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/games/altv/entrypoint.sh b/games/altv/entrypoint.sh index d9f5b44..11acd70 100644 --- a/games/altv/entrypoint.sh +++ b/games/altv/entrypoint.sh @@ -1,12 +1,13 @@ #!/bin/bash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') echo -e ":/home/container$ ${MODIFIED_STARTUP}" # Run the Server -eval ${MODIFIED_STARTUP} \ No newline at end of file +eval ${MODIFIED_STARTUP} diff --git a/games/arma3/entrypoint.sh b/games/arma3/entrypoint.sh index 31b19fd..d01b9a4 100644 --- a/games/arma3/entrypoint.sh +++ b/games/arma3/entrypoint.sh @@ -33,24 +33,24 @@ function RunSteamCMD { #[Input: int server=0 mod=1 optional_mod=2; int id] if [[ -f "${STEAMCMD_LOG}" ]]; then rm -f "${STEAMCMD_LOG:?}" fi - + updateAttempt=0 while (( $updateAttempt < $STEAMCMD_ATTEMPTS )); do # Loop for specified number of attempts # Increment attempt counter updateAttempt=$((updateAttempt+1)) - + if (( $updateAttempt > 1 )); then # Notify if not first attempt echo -e "\t${YELLOW}Re-Attempting download/update in 3 seconds...${NC} (Attempt ${CYAN}${updateAttempt}${NC} of ${CYAN}${STEAMCMD_ATTEMPTS}${NC})\n" sleep 3 fi - + # Check if updating server or mod if [[ $1 == 0 ]]; then # Server ${STEAMCMD_DIR}/steamcmd.sh +force_install_dir /home/container "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +app_update $2 $extraFlags $validateServer +quit | tee -a "${STEAMCMD_LOG}" else # Mod ${STEAMCMD_DIR}/steamcmd.sh "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +workshop_download_item $GAME_ID $2 +quit | tee -a "${STEAMCMD_LOG}" fi - + # Error checking for SteamCMD steamcmdExitCode=${PIPESTATUS[0]} if [[ -n $(grep -i "error\|failed" "${STEAMCMD_LOG}" | grep -iv "setlocal\|SDL") ]]; then # Catch errors (ignore setlocale and SDL warnings) @@ -166,6 +166,11 @@ function RemoveDuplicates { #[Input: str - Output: printf of new str] } # === ENTRYPOINT START === + +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP + cd /home/container sleep 1 @@ -213,17 +218,17 @@ allMods=$(echo $allMods | sed -e 's/;/ /g') # Convert from string to array if [[ ${UPDATE_SERVER} == 1 ]]; then echo -e "\n${GREEN}[STARTUP]: ${CYAN}Starting checks for all updates...${NC}" echo -e "(It is okay to ignore any \"SDL\" errors during this process)\n" - + ## Update game server echo -e "${GREEN}[UPDATE]:${NC} Checking for game server updates with App ID: ${CYAN}${STEAMCMD_APPID}${NC}..." - + if [[ ${VALIDATE_SERVER} == 1 ]]; then # Validate will be added as a parameter if specified echo -e "\t${CYAN}File validation enabled.${NC} (This may take extra time to complete)" validateServer="validate" else validateServer="" fi - + # Determine what extra flags should be set if [[ -n ${STEAMCMD_EXTRA_FLAGS} ]]; then echo -e "\t(${YELLOW}Advanced${NC}) Extra SteamCMD flags specified: ${CYAN}${STEAMCMD_EXTRA_FLAGS}${NC}\n" @@ -235,9 +240,9 @@ if [[ ${UPDATE_SERVER} == 1 ]]; then echo -e "" extraFlags="" fi - + RunSteamCMD 0 ${STEAMCMD_APPID} - + ## Update mods if [[ -n $allMods ]] && [[ ${DISABLE_MOD_UPDATES} != 1 ]]; then echo -e "\n${GREEN}[UPDATE]:${NC} Checking all ${CYAN}Steam Workshop mods${NC} for updates..." @@ -274,7 +279,7 @@ if [[ ${UPDATE_SERVER} == 1 ]]; then echo -e "\tMod was last updated: ${CYAN}$(date -d @${latestUpdate})${NC}" fi echo -e "\tAttempting mod update/download via SteamCMD...\n" - + RunSteamCMD $modType $modID fi fi @@ -298,7 +303,7 @@ if [[ ${UPDATE_SERVER} == 1 ]]; then if [[ "${CLIENT_MODS}" != *"@${modID};"* ]]; then echo -e "\tKey file and directory for unconfigured optional mod ${CYAN}${modID}${NC} is being deleted..." fi - + # Delete the optional mod .bikey file and directory rm ${keyFile} rmdir ./@${modID}_optional 2> /dev/null diff --git a/games/source/entrypoint.sh b/games/source/entrypoint.sh index f2f2744..8f43bc9 100644 --- a/games/source/entrypoint.sh +++ b/games/source/entrypoint.sh @@ -30,7 +30,7 @@ TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/go/entrypoint.sh b/go/entrypoint.sh index ab6fbe7..7adafec 100644 --- a/go/entrypoint.sh +++ b/go/entrypoint.sh @@ -20,14 +20,14 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# +# # Default the TZ environment variable to UTC. TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/java/entrypoint.sh b/java/entrypoint.sh index b6d29da..e92f3d3 100644 --- a/java/entrypoint.sh +++ b/java/entrypoint.sh @@ -27,7 +27,7 @@ TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/mariadb/entrypoint.sh b/mariadb/entrypoint.sh index cd80a9a..d3884d4 100644 --- a/mariadb/entrypoint.sh +++ b/mariadb/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') diff --git a/mongodb/entrypoint.sh b/mongodb/entrypoint.sh index cd80a9a..d3884d4 100644 --- a/mongodb/entrypoint.sh +++ b/mongodb/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') diff --git a/mono/entrypoint.sh b/mono/entrypoint.sh index ef6ae2e..fe2d5f6 100644 --- a/mono/entrypoint.sh +++ b/mono/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP="eval $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')" diff --git a/nodejs/entrypoint.sh b/nodejs/entrypoint.sh index 440c2bf..60c2279 100644 --- a/nodejs/entrypoint.sh +++ b/nodejs/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Print Node.js Version node -v diff --git a/oses/alpine/entrypoint.sh b/oses/alpine/entrypoint.sh index 5b4ce5f..e156de6 100644 --- a/oses/alpine/entrypoint.sh +++ b/oses/alpine/entrypoint.sh @@ -18,14 +18,14 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# +# # Default the TZ environment variable to UTC. TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/oses/debian/entrypoint.sh b/oses/debian/entrypoint.sh index 9a5cab5..461e6b9 100644 --- a/oses/debian/entrypoint.sh +++ b/oses/debian/entrypoint.sh @@ -1,12 +1,13 @@ #!/bin/bash cd /home/container -# Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +# Make internal Docker IP address available to processes. +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') echo -e ":/home/container$ ${MODIFIED_STARTUP}" # Run the Server -eval ${MODIFIED_STARTUP} \ No newline at end of file +eval ${MODIFIED_STARTUP} diff --git a/oses/ubuntu/entrypoint.sh b/oses/ubuntu/entrypoint.sh index d9f5b44..461e6b9 100644 --- a/oses/ubuntu/entrypoint.sh +++ b/oses/ubuntu/entrypoint.sh @@ -2,11 +2,12 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') echo -e ":/home/container$ ${MODIFIED_STARTUP}" # Run the Server -eval ${MODIFIED_STARTUP} \ No newline at end of file +eval ${MODIFIED_STARTUP} diff --git a/postgres/entrypoint.sh b/postgres/entrypoint.sh index 0a72c42..53b47f4 100644 --- a/postgres/entrypoint.sh +++ b/postgres/entrypoint.sh @@ -5,7 +5,8 @@ cd /home/container postgres --version # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')` diff --git a/python/entrypoint.sh b/python/entrypoint.sh index 0a7b93d..aab4aea 100644 --- a/python/entrypoint.sh +++ b/python/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Print current Python version python --version diff --git a/redis/entrypoint.sh b/redis/entrypoint.sh index e0ae99e..6e19f17 100644 --- a/redis/entrypoint.sh +++ b/redis/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Replace Startup Variables MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') diff --git a/rust/entrypoint.sh b/rust/entrypoint.sh index ed8bce1..c865f6c 100644 --- a/rust/entrypoint.sh +++ b/rust/entrypoint.sh @@ -2,7 +2,8 @@ cd /home/container # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP # Print current Rust version cargo --version diff --git a/voice/teaspeak/entrypoint.sh b/voice/teaspeak/entrypoint.sh index 49123df..9b0d21f 100644 --- a/voice/teaspeak/entrypoint.sh +++ b/voice/teaspeak/entrypoint.sh @@ -3,7 +3,7 @@ TZ=${TZ:-UTC} export TZ # Set environment variable that holds the Internal Docker IP -INTERNAL_IP=$(ip route get 1 | awk '{print $NF;exit}') +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP # Switch to the container's working directory diff --git a/wine/entrypoint.sh b/wine/entrypoint.sh index 3ee92c7..be33420 100644 --- a/wine/entrypoint.sh +++ b/wine/entrypoint.sh @@ -7,7 +7,8 @@ echo "Current timezone: $(cat /etc/timezone)" wine --version # Make internal Docker IP address available to processes. -export INTERNAL_IP=`ip route get 1 | awk '{print $NF;exit}'` +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP ## just in case someone removed the defaults. if [ "${STEAM_USER}" == "" ]; then From 70e5a4321ac4db5f541f0c254a9fc6434fbe866e Mon Sep 17 00:00:00 2001 From: Quinten <67589015+QuintenQVD0@users.noreply.github.com> Date: Mon, 2 May 2022 17:30:09 +0200 Subject: [PATCH 02/12] add samp image --- .github/workflows/games.yml | 1 + README.md | 2 ++ games/samp/Dockerfile | 23 +++++++++++++++++++++++ games/samp/entrypoint.sh | 12 ++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 games/samp/Dockerfile create mode 100644 games/samp/entrypoint.sh diff --git a/.github/workflows/games.yml b/.github/workflows/games.yml index 2a84791..53e7d85 100644 --- a/.github/workflows/games.yml +++ b/.github/workflows/games.yml @@ -19,6 +19,7 @@ jobs: - altv - arma3 - source + - samp steps: - uses: actions/checkout@v2 - uses: docker/setup-buildx-action@v1 diff --git a/README.md b/README.md index fa04efe..b6aef34 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ is tagged correctly. * `ghcr.io/parkervcp/games:arma3` * [`source`](/games/source) * `ghcr.io/parkervcp/games:source` +* [`samp`](/games/samp) + * `ghcr.io/parkervcp/games:samp` ### [Golang](/go) diff --git a/games/samp/Dockerfile b/games/samp/Dockerfile new file mode 100644 index 0000000..3e05c2f --- /dev/null +++ b/games/samp/Dockerfile @@ -0,0 +1,23 @@ +FROM --platform=$BUILDPLATFORM debian:bullseye-slim + +LABEL author="QuintenQVD" maintainer="josdekurk@gmail.com" + +RUN apt update \ + && apt -y upgrade +RUN dpkg --add-architecture i386 \ + && apt update \ + && apt upgrade -y \ + && apt install -y libstdc++6 lib32stdc++6 tar curl iproute2 openssl fontconfig dirmngr ca-certificates dnsutils tzdata zip \ + && apt install -y libtbb2:i386 libtbb-dev:i386 libicu-dev:i386 tzdata \ + && useradd -d /home/container -m container + +RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container +RUN rm -rf /var/lib/apt/lists/* + + +USER container +ENV USER=container HOME=/home/container +WORKDIR /home/container + +COPY ./entrypoint.sh /entrypoint.sh +CMD [ "/bin/bash", "/entrypoint.sh" ] \ No newline at end of file diff --git a/games/samp/entrypoint.sh b/games/samp/entrypoint.sh new file mode 100644 index 0000000..6dda5e5 --- /dev/null +++ b/games/samp/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash +cd /home/container + +# Make internal Docker IP address available to processes. +export INTERNAL_IP=`ip route get 1 | awk '{print $(NF-2);exit}'` + +# Replace Startup Variables +MODIFIED_STARTUP=$(echo -e ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g') +echo -e ":/home/container$ ${MODIFIED_STARTUP}" + +# Run the Server +eval ${MODIFIED_STARTUP} From 73a2340b3be9ffc1b540eb1d1a90eada3cca8a28 Mon Sep 17 00:00:00 2001 From: Quinten <67589015+QuintenQVD0@users.noreply.github.com> Date: Mon, 2 May 2022 17:54:08 +0200 Subject: [PATCH 03/12] fix alphabetical orde --- .github/workflows/games.yml | 3 ++- README.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/games.yml b/.github/workflows/games.yml index 53e7d85..d4ec133 100644 --- a/.github/workflows/games.yml +++ b/.github/workflows/games.yml @@ -18,8 +18,9 @@ jobs: game: - altv - arma3 - - source - samp + - source + steps: - uses: actions/checkout@v2 - uses: docker/setup-buildx-action@v1 diff --git a/README.md b/README.md index b6aef34..e0ddbbe 100644 --- a/README.md +++ b/README.md @@ -79,10 +79,11 @@ is tagged correctly. * `ghcr.io/parkervcp/games:altv` * [`arma3`](/games/arma3) * `ghcr.io/parkervcp/games:arma3` +* [`samp`](/games/samp) + * `ghcr.io/parkervcp/games:samp` * [`source`](/games/source) * `ghcr.io/parkervcp/games:source` -* [`samp`](/games/samp) - * `ghcr.io/parkervcp/games:samp` + ### [Golang](/go) From bb84c74981cf488bd03b88c5d1234b86e5b55a11 Mon Sep 17 00:00:00 2001 From: Quinten <67589015+QuintenQVD0@users.noreply.github.com> Date: Tue, 3 May 2022 07:06:37 +0200 Subject: [PATCH 04/12] Fix double tzdata install --- games/samp/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/games/samp/Dockerfile b/games/samp/Dockerfile index 3e05c2f..e1b5ff4 100644 --- a/games/samp/Dockerfile +++ b/games/samp/Dockerfile @@ -8,7 +8,7 @@ RUN dpkg --add-architecture i386 \ && apt update \ && apt upgrade -y \ && apt install -y libstdc++6 lib32stdc++6 tar curl iproute2 openssl fontconfig dirmngr ca-certificates dnsutils tzdata zip \ - && apt install -y libtbb2:i386 libtbb-dev:i386 libicu-dev:i386 tzdata \ + && apt install -y libtbb2:i386 libtbb-dev:i386 libicu-dev:i386 \ && useradd -d /home/container -m container RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container @@ -20,4 +20,4 @@ ENV USER=container HOME=/home/container WORKDIR /home/container COPY ./entrypoint.sh /entrypoint.sh -CMD [ "/bin/bash", "/entrypoint.sh" ] \ No newline at end of file +CMD [ "/bin/bash", "/entrypoint.sh" ] From e750a642c92933b15f7921325820d1569642a4a5 Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Sun, 22 May 2022 17:35:03 -0700 Subject: [PATCH 05/12] Arma 3 Image Cleanup & Refurbishment Files: - Remove dependency of having `libnss_wrapper.so` libraries directly in the image. Instead, use the libraries provided with their respective packages. This fixes the current 32-bit version being broken and ensures the libraries stay up to date with their respective packages. - Slight change to passwd.template to accommodate variable name change. Dockerfile: - Change the base image to Debian, which from testing appears to run cleaner and faster for Arma. It also should yield a smaller image. - Fix depreciated `ENV` call format. - Removed un-needed packages. - Added iproute2 package. - Consolidated the NSS Wrapper setup to a commented group of lines to make understanding it's purpose and setup more clear. - Added shell flag to `useradd` command. Entrypoint: - General cleanup. - Changed `LD_PRELOAD`s to point to package-provided library file locations. --- games/arma3/Dockerfile | 52 +++++++++++++++++++++--------- games/arma3/entrypoint.sh | 19 ++++++----- games/arma3/libnss_wrapper.so | Bin 55040 -> 0 bytes games/arma3/libnss_wrapper_x64.so | Bin 56048 -> 0 bytes games/arma3/passwd.template | 2 +- 5 files changed, 49 insertions(+), 24 deletions(-) delete mode 100644 games/arma3/libnss_wrapper.so delete mode 100644 games/arma3/libnss_wrapper_x64.so diff --git a/games/arma3/Dockerfile b/games/arma3/Dockerfile index 49ec2a8..428b7d2 100644 --- a/games/arma3/Dockerfile +++ b/games/arma3/Dockerfile @@ -1,29 +1,51 @@ -FROM ubuntu:20.04 +FROM --platform=$BUILDPLATFORM debian:stable-slim LABEL author="David Wolfe (Red-Thirten)" maintainer="rehlmgaming@gmail.com" -ENV DEBIAN_FRONTEND noninteractive -ENV USER_NAME container -ENV NSS_WRAPPER_PASSWD /tmp/passwd -ENV NSS_WRAPPER_GROUP /tmp/group -# Install Dependencies +LABEL org.opencontainers.image.source="https://github.com/parkervcp/yolks" +LABEL org.opencontainers.image.licenses=MIT + +## Update base packages and install dependencies +ENV DEBIAN_FRONTEND=noninteractive RUN dpkg --add-architecture i386 \ && apt-get update \ && apt-get upgrade -y \ - && apt-get install -y libgcc-10-dev libstdc++-10-dev libtinfo5 lib64z1 libcurl3-gnutls \ - && apt-get install -y libnss-wrapper gettext-base tar curl gcc g++ libc6 libtbb2 lib32z1 lib32gcc1 lib32stdc++6 libsdl2-2.0-0 libsdl2-2.0-0:i386 libtbb2:i386 lib32stdc++6 libtinfo5:i386 libncurses5:i386 libcurl3-gnutls:i386 tzdata \ - && useradd -m -d /home/container -s /bin/bash container \ - && touch ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ + && apt-get install -y \ + curl \ + tzdata \ + locales \ + iproute2 \ + gettext-base \ + ca-certificates \ + libssl-dev \ + lib32gcc-s1 \ + libsdl2-2.0-0 \ + libsdl2-2.0-0:i386 \ + libstdc++6 \ + libstdc++6:i386 \ + lib32stdc++6 \ + libnss-wrapper \ + libnss-wrapper:i386 \ + libtbb2 \ + libtbb2:i386 + +## Configure locale +RUN update-locale lang=en_US.UTF-8 \ + && dpkg-reconfigure --frontend noninteractive locales + +## Prepare NSS Wrapper for the entrypoint as a workaround for Arma 3 requiring a valid UID +ENV NSS_WRAPPER_PASSWD=/tmp/passwd NSS_WRAPPER_GROUP=/tmp/group +RUN touch ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ && chgrp 0 ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ && chmod g+rw ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} - ADD passwd.template /passwd.template +## Setup user and working directory +RUN useradd -m -d /home/container -s /bin/bash container USER container -ENV HOME /home/container +ENV USER=container HOME=/home/container WORKDIR /home/container -COPY ./libnss_wrapper.so /libnss_wrapper.so -COPY ./libnss_wrapper_x64.so /libnss_wrapper_x64.so +## Copy over and execute entrypoint.sh COPY ./entrypoint.sh /entrypoint.sh -CMD ["/bin/bash", "/entrypoint.sh"] +CMD [ "/bin/bash", "/entrypoint.sh" ] diff --git a/games/arma3/entrypoint.sh b/games/arma3/entrypoint.sh index d01b9a4..b9925d4 100644 --- a/games/arma3/entrypoint.sh +++ b/games/arma3/entrypoint.sh @@ -2,8 +2,8 @@ ## File: Pterodactyl Arma 3 Image - entrypoint.sh ## Author: David Wolfe (Red-Thirten) -## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/) -## Date: 2021/07/13 +## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/), Stephen White (SilK) +## Date: 2022/05/22 ## License: MIT License ## === CONSTANTS === @@ -167,12 +167,15 @@ function RemoveDuplicates { #[Input: str - Output: printf of new str] # === ENTRYPOINT START === +# Wait for the container to fully initialize +sleep 1 + # Set environment variable that holds the Internal Docker IP INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') export INTERNAL_IP -cd /home/container -sleep 1 +# Switch to the container's working directory +cd /home/container || exit 1 # Check for old eggs if [[ -z ${VALIDATE_SERVER} ]]; then # VALIDATE_SERVER was not in the previous version @@ -350,15 +353,15 @@ if [[ ! -f ./basic.cfg ]]; then curl -sSL ${BASIC_URL} -o ./basic.cfg fi -# $NSS_WRAPPER_PASSWD and $NSS_WRAPPER_GROUP have been set by the Dockerfile +# Setup NSS Wrapper for use ($NSS_WRAPPER_PASSWD and $NSS_WRAPPER_GROUP have been set by the Dockerfile) export USER_ID=$(id -u) export GROUP_ID=$(id -g) envsubst < /passwd.template > ${NSS_WRAPPER_PASSWD} -if [[ ${SERVER_BINARY} == *"x64"* ]]; then # Check which libnss_wrapper architecture to run, based off the server binary name - export LD_PRELOAD=/libnss_wrapper_x64.so +if [[ ${SERVER_BINARY} == *"x64"* ]]; then # Check which libnss-wrapper architecture to run, based off the server binary name + export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnss_wrapper.so else - export LD_PRELOAD=/libnss_wrapper.so + export LD_PRELOAD=/usr/lib/i386-linux-gnu/libnss_wrapper.so fi # Replace Startup Variables diff --git a/games/arma3/libnss_wrapper.so b/games/arma3/libnss_wrapper.so deleted file mode 100644 index 8f32e83e9fc396154656aa81070002345193ead9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55040 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 U)Pj4bXK0wrHSqpk!>ZHx5AF@Q9smFU diff --git a/games/arma3/libnss_wrapper_x64.so b/games/arma3/libnss_wrapper_x64.so deleted file mode 100644 index 8f7438a19e1d6ef2b8ad673e6324ade5e0a76469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56048 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 Date: Sun, 22 May 2022 18:32:49 -0700 Subject: [PATCH 06/12] Initial Upload Currently only works with experimental branch of DayZ Standalone. --- .github/workflows/games.yml | 1 + games/dayz/Dockerfile | 49 +++++++ games/dayz/README.md | 2 + games/dayz/entrypoint.sh | 284 ++++++++++++++++++++++++++++++++++++ games/dayz/passwd.template | 26 ++++ 5 files changed, 362 insertions(+) create mode 100644 games/dayz/Dockerfile create mode 100644 games/dayz/README.md create mode 100644 games/dayz/entrypoint.sh create mode 100644 games/dayz/passwd.template diff --git a/.github/workflows/games.yml b/.github/workflows/games.yml index d4ec133..fe85f0f 100644 --- a/.github/workflows/games.yml +++ b/.github/workflows/games.yml @@ -18,6 +18,7 @@ jobs: game: - altv - arma3 + - dayz - samp - source diff --git a/games/dayz/Dockerfile b/games/dayz/Dockerfile new file mode 100644 index 0000000..55d074e --- /dev/null +++ b/games/dayz/Dockerfile @@ -0,0 +1,49 @@ +FROM --platform=$BUILDPLATFORM debian:stable-slim + +LABEL author="David Wolfe (Red-Thirten)" maintainer="rehlmgaming@gmail.com" + +LABEL org.opencontainers.image.source="https://github.com/parkervcp/yolks" +LABEL org.opencontainers.image.licenses=MIT + +## Update base packages and install dependencies +ENV DEBIAN_FRONTEND=noninteractive +RUN dpkg --add-architecture i386 \ + && apt update \ + && apt upgrade -y \ + && apt install -y \ + curl \ + tzdata \ + locales \ + iproute2 \ + gettext-base \ + ca-certificates \ + libssl-dev \ + lib32gcc-s1 \ + libsdl2-2.0-0 \ + libsdl2-2.0-0:i386 \ + libstdc++6 \ + libstdc++6:i386 \ + lib32stdc++6 \ + libcap2 \ + libnss-wrapper + +## Configure locale +RUN update-locale lang=en_US.UTF-8 \ + && dpkg-reconfigure --frontend noninteractive locales + +## Prepare NSS Wrapper for the entrypoint as a workaround for Arma 3 requiring a valid UID +ENV NSS_WRAPPER_PASSWD=/tmp/passwd NSS_WRAPPER_GROUP=/tmp/group +RUN touch ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ + && chgrp 0 ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} \ + && chmod g+rw ${NSS_WRAPPER_PASSWD} ${NSS_WRAPPER_GROUP} +ADD passwd.template /passwd.template + +## Setup user and working directory +RUN useradd -m -d /home/container -s /bin/bash container +USER container +ENV USER=container HOME=/home/container +WORKDIR /home/container + +## Copy over and execute entrypoint.sh +COPY ./entrypoint.sh /entrypoint.sh +CMD [ "/bin/bash", "/entrypoint.sh" ] diff --git a/games/dayz/README.md b/games/dayz/README.md new file mode 100644 index 0000000..f13724e --- /dev/null +++ b/games/dayz/README.md @@ -0,0 +1,2 @@ +# DayZ +Docker container designed to run Bohemia Interactive's DayZ dedicated server. diff --git a/games/dayz/entrypoint.sh b/games/dayz/entrypoint.sh new file mode 100644 index 0000000..080b372 --- /dev/null +++ b/games/dayz/entrypoint.sh @@ -0,0 +1,284 @@ +#!/bin/bash + +## File: Pterodactyl DayZ SA Image - entrypoint.sh +## Author: David Wolfe (Red-Thirten) +## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/), Stephen White (SilK) +## Date: 2022/05/22 +## License: MIT License + +## === CONSTANTS === +STEAMCMD_DIR="./steamcmd" # SteamCMD's directory containing steamcmd.sh +STEAMCMD_LOG="${STEAMCMD_DIR}/steamcmd.log" # Log file for SteamCMD +GAME_ID=221100 # SteamCMD ID for the DayZ SA GAME (not server). Only used for Workshop mod downloads. + +# Color Codes +CYAN='\033[0;36m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +## === ENVIRONMENT VARS === +# STARTUP, STARTUP_PARAMS, STEAM_USER, STEAM_PASS, SERVER_BINARY, MOD_FILE, MODIFICATIONS, SERVERMODS, UPDATE_SERVER, VALIDATE_SERVER, MODS_LOWERCASE, STEAMCMD_EXTRA_FLAGS, STEAMCMD_APPID, SERVER_PASSWORD, STEAMCMD_ATTEMPTS, DISABLE_MOD_UPDATES + +## === GLOBAL VARS === +# validateServer, extraFlags, updateAttempt, modifiedStartup, allMods, CLIENT_MODS + +## === DEFINE FUNCTIONS === + +# Runs SteamCMD with specified variables and performs error handling. +function RunSteamCMD { #[Input: int server=0 mod=1; int id] + # Clear previous SteamCMD log + if [[ -f "${STEAMCMD_LOG}" ]]; then + rm -f "${STEAMCMD_LOG:?}" + fi + + updateAttempt=0 + while (( $updateAttempt < $STEAMCMD_ATTEMPTS )); do # Loop for specified number of attempts + # Increment attempt counter + updateAttempt=$((updateAttempt+1)) + + if (( $updateAttempt > 1 )); then # Notify if not first attempt + echo -e "\t${YELLOW}Re-Attempting download/update in 3 seconds...${NC} (Attempt ${CYAN}${updateAttempt}${NC} of ${CYAN}${STEAMCMD_ATTEMPTS}${NC})\n" + sleep 3 + fi + + # Check if updating server or mod + if [[ $1 == 0 ]]; then # Server + ${STEAMCMD_DIR}/steamcmd.sh +force_install_dir /home/container "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +app_update $2 $extraFlags $validateServer +quit | tee -a "${STEAMCMD_LOG}" + else # Mod + ${STEAMCMD_DIR}/steamcmd.sh "+login \"${STEAM_USER}\" \"${STEAM_PASS}\"" +workshop_download_item $GAME_ID $2 +quit | tee -a "${STEAMCMD_LOG}" + fi + + # Error checking for SteamCMD + steamcmdExitCode=${PIPESTATUS[0]} + if [[ -n $(grep -i "error\|failed" "${STEAMCMD_LOG}" | grep -iv "setlocal\|SDL") ]]; then # Catch errors (ignore setlocale and SDL warnings) + # Soft errors + if [[ -n $(grep -i "Timeout downloading item" "${STEAMCMD_LOG}") ]]; then # Mod download timeout + echo -e "\n${YELLOW}[UPDATE]: ${NC}Timeout downloading Steam Workshop mod: \"${CYAN}${modName}${NC}\" (${CYAN}${2}${NC})" + echo -e "\t(This is expected for particularly large mods)" + elif [[ -n $(grep -i "0x402\|0x6\|0x602" "${STEAMCMD_LOG}") ]]; then # Connection issue with Steam + echo -e "\n${YELLOW}[UPDATE]: ${NC}Connection issue with Steam servers." + echo -e "\t(Steam servers may currently be down, or a connection cannot be made reliably)" + # Hard errors + elif [[ -n $(grep -i "Password check for AppId" "${STEAMCMD_LOG}") ]]; then # Incorrect beta branch password + echo -e "\n${RED}[UPDATE]: ${YELLOW}Incorrect password given for beta branch. ${CYAN}Skipping download...${NC}" + echo -e "\t(Check your \"[ADVANCED] EXTRA FLAGS FOR STEAMCMD\" startup parameter)" + break + # Fatal errors + elif [[ -n $(grep -i "Invalid Password\|two-factor\|No subscription" "${STEAMCMD_LOG}") ]]; then # Wrong username/password, Steam Guard is turned on, or host is using anonymous account + echo -e "\n${RED}[UPDATE]: Cannot login to Steam - Improperly configured account and/or credentials" + echo -e "\t${YELLOW}Please contact your administrator/host and give them the following message:${NC}" + echo -e "\t${CYAN}Your Egg, or your client's server, is not configured with valid Steam credentials.${NC}" + echo -e "\t${CYAN}Either the username/password is wrong, or Steam Guard is not properly configured\n\taccording to this egg's documentation/README.${NC}\n" + exit 1 + elif [[ -n $(grep -i "Download item" "${STEAMCMD_LOG}") ]]; then # Steam account does not own base game for mod downloads, or unknown + echo -e "\n${RED}[UPDATE]: Cannot download mod - Download failed" + echo -e "\t${YELLOW}While unknown, this error is likely due to your host's Steam account not owning the base game.${NC}" + echo -e "\t${YELLOW}(Please contact your administrator/host if this issue persists)${NC}\n" + exit 1 + elif [[ -n $(grep -i "0x202\|0x212" "${STEAMCMD_LOG}") ]]; then # Not enough disk space + echo -e "\n${RED}[UPDATE]: Unable to complete download - Not enough storage" + echo -e "\t${YELLOW}You have run out of your allotted disk space.${NC}" + echo -e "\t${YELLOW}Please contact your administrator/host for potential storage upgrades.${NC}\n" + exit 1 + elif [[ -n $(grep -i "0x606" "${STEAMCMD_LOG}") ]]; then # Disk write failure + echo -e "\n${RED}[UPDATE]: Unable to complete download - Disk write failure" + echo -e "\t${YELLOW}This is normally caused by directory permissions issues,\n\tbut could be a more serious hardware issue.${NC}" + echo -e "\t${YELLOW}(Please contact your administrator/host if this issue persists)${NC}\n" + exit 1 + else # Unknown caught error + echo -e "\n${RED}[UPDATE]: ${YELLOW}An unknown error has occurred with SteamCMD. ${CYAN}Skipping download...${NC}" + echo -e "\t(Please contact your administrator/host if this issue persists)" + break + fi + elif [[ $steamcmdExitCode != 0 ]]; then # Unknown fatal error + echo -e "\n${RED}[UPDATE]: SteamCMD has crashed for an unknown reason!${NC} (Exit code: ${CYAN}${steamcmdExitCode}${NC})" + echo -e "\t${YELLOW}(Please contact your administrator/host for support)${NC}\n" + exit $steamcmdExitCode + else # Success! + if [[ $1 == 0 ]]; then # Server + echo -e "\n${GREEN}[UPDATE]: Game server is up to date!${NC}" + else # Mod + # Move the downloaded mod to the root directory, and replace existing mod if needed + mkdir -p ./@$2 + rm -rf ./@$2/* + mv -f ./Steam/steamapps/workshop/content/$GAME_ID/$2/* ./@$2 + rm -d ./Steam/steamapps/workshop/content/$GAME_ID/$2 + # Make the mods contents all lowercase + ModsLowercase @$2 + # Move any .bikey's to the keys directory + echo -e "\tMoving any mod ${CYAN}.bikey${NC} files to the ${CYAN}~/keys/${NC} folder..." + find ./@$2 -name "*.bikey" -type f -exec cp {} ./keys \; + echo -e "${GREEN}[UPDATE]: Mod download/update successful!${NC}" + fi + break + fi + if (( $updateAttempt == $STEAMCMD_ATTEMPTS )); then # Notify if failed last attempt + if [[ $1 == 0 ]]; then # Server + echo -e "\t${RED}Final attempt made! ${YELLOW}Unable to complete game server update. ${CYAN}Skipping...${NC}" + echo -e "\t(Please try again at a later time)" + sleep 3 + else # Mod + echo -e "\t${RED}Final attempt made! ${YELLOW}Unable to complete mod download/update. ${CYAN}Skipping...${NC}" + echo -e "\t(You may try again later, or manually upload this mod to your server via SFTP)" + sleep 3 + fi + fi + done +} + +# Takes a directory (string) as input, and recursively makes all files & folders lowercase. +function ModsLowercase { + echo -e "\n\tMaking mod ${CYAN}$1${NC} files/folders lowercase..." + for SRC in `find ./$1 -depth` + do + DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'` + if [ "${SRC}" != "${DST}" ] + then + [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" + fi + done +} + +# Removes duplicate items from a semicolon delimited string +function RemoveDuplicates { #[Input: str - Output: printf of new str] + if [[ -n $1 ]]; then # If nothing to compare, skip to prevent extra semicolon being returned + echo $1 | sed -e 's/;/\n/g' | sort -u | xargs printf '%s;' + fi +} + +## === ENTRYPOINT START === + +# Wait for the container to fully initialize +sleep 1 + +# Set environment variable that holds the Internal Docker IP +INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}') +export INTERNAL_IP + +# Switch to the container's working directory +cd /home/container || exit 1 + +# Collect and parse all specified mods +if [[ -n ${MODIFICATIONS} ]] && [[ ${MODIFICATIONS} != *\; ]]; then # Add manually specified mods to the client-side mods list, while checking for trailing semicolon + CLIENT_MODS="${MODIFICATIONS};" +else + CLIENT_MODS=${MODIFICATIONS} +fi +# If the mod list file exists and is valid, parse and add mods to the client-side mods list +if [[ -f ${MOD_FILE} ]] && [[ -n "$(cat ${MOD_FILE} | grep 'Created by DayZ Launcher')" ]]; then + CLIENT_MODS+=$(cat ${MOD_FILE} | grep 'id=' | cut -d'=' -f3 | cut -d'"' -f1 | xargs printf '@%s;') +elif [[ -n "${MOD_FILE}" ]]; then # If MOD_FILE is not null, warn user file is missing or invalid + echo -e "\n${YELLOW}[STARTUP_WARN]: DayZ Modlist file \"${CYAN}${MOD_FILE}${YELLOW}\" could not be found, or is invalid!${NC}" + echo -e "\tEnsure your uploaded modlist's file name matches your Startup Parameter." + echo -e "\tOnly files exported from a DayZ Launcher are permitted." + if [[ -n "${CLIENT_MODS}" ]]; then + echo -e "\t${CYAN}Reverting to the manual mod list...${NC}" + fi +fi +# Add server mods to the master mods list, while checking for trailing semicolon +if [[ -n ${SERVERMODS} ]] && [[ ${SERVERMODS} != *\; ]]; then + allMods="${SERVERMODS};" +else + allMods=${SERVERMODS} +fi +allMods+=$CLIENT_MODS # Add all client-side mods to the master mod list +CLIENT_MODS=$(RemoveDuplicates ${CLIENT_MODS}) # Remove duplicate mods from CLIENT_MODS, if present +allMods=$(RemoveDuplicates ${allMods}) # Remove duplicate mods from allMods, if present +allMods=$(echo $allMods | sed -e 's/;/ /g') # Convert from string to array + +# Update everything (server and mods), if specified +if [[ ${UPDATE_SERVER} == 1 ]]; then + echo -e "\n${GREEN}[STARTUP]: ${CYAN}Starting checks for all updates...${NC}" + echo -e "(It is okay to ignore any \"SDL\" errors during this process)\n" + + ## Update game server + echo -e "${GREEN}[UPDATE]:${NC} Checking for game server updates with App ID: ${CYAN}${STEAMCMD_APPID}${NC}..." + + if [[ ${VALIDATE_SERVER} == 1 ]]; then # Validate will be added as a parameter if specified + echo -e "\t${CYAN}File validation enabled.${NC} (This may take extra time to complete)" + validateServer="validate" + else + validateServer="" + fi + + # Determine what extra flags should be set + if [[ -n ${STEAMCMD_EXTRA_FLAGS} ]]; then + echo -e "\t(${YELLOW}Advanced${NC}) Extra SteamCMD flags specified: ${CYAN}${STEAMCMD_EXTRA_FLAGS}${NC}\n" + extraFlags=${STEAMCMD_EXTRA_FLAGS} + else + echo -e "" + extraFlags="" + fi + + RunSteamCMD 0 ${STEAMCMD_APPID} + + ## Update mods + if [[ -n $allMods ]] && [[ ${DISABLE_MOD_UPDATES} != 1 ]]; then + echo -e "\n${GREEN}[UPDATE]:${NC} Checking all ${CYAN}Steam Workshop mods${NC} for updates..." + for modID in $(echo $allMods | sed -e 's/@//g') + do + if [[ $modID =~ ^[0-9]+$ ]]; then # Only check mods that are in ID-form + # Get mod's latest update in epoch time from its Steam Workshop changelog page + latestUpdate=$(curl -sL https://steamcommunity.com/sharedfiles/filedetails/changelog/$modID | grep '

$(find @$modID | head -1 | xargs stat -c%Y) ) ]]; then + # Get the mod's name from the Workshop page as well + modName=$(curl -sL https://steamcommunity.com/sharedfiles/filedetails/changelog/$modID | grep 'workshopItemTitle' | cut -d'>' -f2 | cut -d'<' -f1) + if [[ -z $modName ]]; then # Set default name if unavailable + modName="[NAME UNAVAILABLE]" + fi + if [[ ! -d @$modID ]]; then + echo -e "\n${GREEN}[UPDATE]:${NC} Downloading new Mod: \"${CYAN}${modName}${NC}\" (${CYAN}${modID}${NC})" + else + echo -e "\n${GREEN}[UPDATE]:${NC} Mod update found for: \"${CYAN}${modName}${NC}\" (${CYAN}${modID}${NC})" + fi + if [[ -n $latestUpdate ]] && [[ $latestUpdate =~ ^[0-9]+$ ]]; then # Notify last update date, if valid + echo -e "\tMod was last updated: ${CYAN}$(date -d @${latestUpdate})${NC}" + fi + echo -e "\tAttempting mod update/download via SteamCMD...\n" + RunSteamCMD 1 $modID + fi + fi + done + echo -e "${GREEN}[UPDATE]:${NC} Steam Workshop mod update check ${GREEN}complete${NC}!" + fi +fi + +# Check if specified server binary exists. +if [[ ! -f ./${SERVER_BINARY} ]]; then + echo -e "\n${RED}[STARTUP_ERR]: Specified DayZ server binary could not be found in the root directory!${NC}" + echo -e "${YELLOW}Please do the following to resolve this issue:${NC}" + echo -e "\t${CYAN}- Double check your \"Server Binary\" Startup Variable is correct.${NC}" + echo -e "\t${CYAN}- Ensure your server has properly installed/updated without errors (reinstalling/updating again may help).${NC}" + echo -e "\t${CYAN}- Use the File Manager to check that your specified server binary file is not missing from the root directory.${NC}\n" + exit 1 +fi + +# Make mods lowercase, if specified +if [[ ${MODS_LOWERCASE} == "1" ]]; then + for modDir in $allMods + do + ModsLowercase $modDir + done +fi + +# Setup NSS Wrapper for use ($NSS_WRAPPER_PASSWD and $NSS_WRAPPER_GROUP have been set by the Dockerfile) +export USER_ID=$(id -u) +export GROUP_ID=$(id -g) +envsubst < /passwd.template > ${NSS_WRAPPER_PASSWD} +export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnss_wrapper.so + +# Replace Startup Variables +modifiedStartup=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')` + +# Start the Server +echo -e "\n${GREEN}[STARTUP]:${NC} Starting server with the following startup command:" +echo -e "${CYAN}${modifiedStartup}${NC}\n" +${modifiedStartup} + +if [ $? -ne 0 ]; then + echo -e "\n${RED}PTDL_CONTAINER_ERR: There was an error while attempting to run the start command.${NC}\n" + exit 1 +fi diff --git a/games/dayz/passwd.template b/games/dayz/passwd.template new file mode 100644 index 0000000..2b0dd45 --- /dev/null +++ b/games/dayz/passwd.template @@ -0,0 +1,26 @@ +root:x:0:0:root:/root:/bin/bash +daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin +bin:x:2:2:bin:/bin:/usr/sbin/nologin +sys:x:3:3:sys:/dev:/usr/sbin/nologin +sync:x:4:65534:sync:/bin:/bin/sync +games:x:5:60:games:/usr/games:/usr/sbin/nologin +man:x:6:12:man:/var/cache/man:/usr/sbin/nologin +lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin +mail:x:8:8:mail:/var/mail:/usr/sbin/nologin +news:x:9:9:news:/var/spool/news:/usr/sbin/nologin +uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin +proxy:x:13:13:proxy:/bin:/usr/sbin/nologin +www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin +backup:x:34:34:backup:/var/backups:/usr/sbin/nologin +list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin +irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin +gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin +nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin +systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false +systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false +systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false +systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false +syslog:x:104:108::/home/syslog:/bin/false +messagebus:x:106:109::/var/run/dbus:/bin/false +bind:x:108:112::/var/cache/bind:/bin/false +${USER}:x:${USER_ID}:${GROUP_ID}:${USER}:${HOME}:/bin/bash \ No newline at end of file From c4c9556772d8dc150d44b84b35bffbd9138a7b8b Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Sun, 22 May 2022 19:15:05 -0700 Subject: [PATCH 07/12] Fix `--platform` FROM flag in Dockerfile --- games/arma3/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/arma3/Dockerfile b/games/arma3/Dockerfile index 428b7d2..82ba373 100644 --- a/games/arma3/Dockerfile +++ b/games/arma3/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="David Wolfe (Red-Thirten)" maintainer="rehlmgaming@gmail.com" From 5e94fc4239047f2e11040be703a88f11fb21a770 Mon Sep 17 00:00:00 2001 From: softwarenoob Date: Mon, 23 May 2022 05:17:41 +0300 Subject: [PATCH 08/12] fix: multi platform builds --- bot/bastion/Dockerfile | 4 ++-- bot/parkertron/Dockerfile | 2 +- bot/red/Dockerfile | 2 +- bot/sinusbot/Dockerfile | 2 +- cassandra/java11_python3/Dockerfile | 2 +- cassandra/java8_python2/Dockerfile | 2 +- dotnet/2.1/Dockerfile | 2 +- dotnet/3.1/Dockerfile | 2 +- dotnet/5/Dockerfile | 2 +- dotnet/6/Dockerfile | 2 +- erlang/22/Dockerfile | 2 +- erlang/23/Dockerfile | 2 +- erlang/24/Dockerfile | 2 +- games/altv/Dockerfile | 4 ++-- games/samp/Dockerfile | 2 +- games/source/Dockerfile | 2 +- go/1.14/Dockerfile | 2 +- go/1.15/Dockerfile | 2 +- go/1.16/Dockerfile | 2 +- installers/alpine/Dockerfile | 2 +- installers/debian/Dockerfile | 4 ++-- voice/teaspeak/Dockerfile | 2 +- 22 files changed, 25 insertions(+), 25 deletions(-) diff --git a/bot/bastion/Dockerfile b/bot/bastion/Dockerfile index 18390f3..00d5508 100644 --- a/bot/bastion/Dockerfile +++ b/bot/bastion/Dockerfile @@ -1,7 +1,7 @@ -FROM node:14-buster +FROM --platform=$TARGETOS/$TARGETARCH node:14-buster LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" - ## install mongo +## install mongo RUN wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | apt-key add - \ && echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main" | tee /etc/apt/sources.list.d/mongodb-org-4.2.list \ && apt update \ diff --git a/bot/parkertron/Dockerfile b/bot/parkertron/Dockerfile index d87f516..87fc60a 100644 --- a/bot/parkertron/Dockerfile +++ b/bot/parkertron/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.9 +FROM --platform=$TARGETOS/$TARGETARCH alpine:3.9 LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" diff --git a/bot/red/Dockerfile b/bot/red/Dockerfile index 29cf0a9..92f9d98 100644 --- a/bot/red/Dockerfile +++ b/bot/red/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8-slim +FROM --platform=$TARGETOS/$TARGETARCH python:3.8-slim LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" diff --git a/bot/sinusbot/Dockerfile b/bot/sinusbot/Dockerfile index bbc4a92..63afc17 100644 --- a/bot/sinusbot/Dockerfile +++ b/bot/sinusbot/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:18.04 +FROM --platform=$TARGETOS/$TARGETARCH ubuntu:18.04 LABEL maintainer="ki2007 " version="1.0" diff --git a/cassandra/java11_python3/Dockerfile b/cassandra/java11_python3/Dockerfile index 785ad40..4f5ddb3 100644 --- a/cassandra/java11_python3/Dockerfile +++ b/cassandra/java11_python3/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM adoptopenjdk/openjdk11:alpine-jre +FROM --platform=$TARGETOS/$TARGETARCH adoptopenjdk/openjdk11:alpine-jre LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/cassandra/java8_python2/Dockerfile b/cassandra/java8_python2/Dockerfile index 1c8260c..32770f4 100644 --- a/cassandra/java8_python2/Dockerfile +++ b/cassandra/java8_python2/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM adoptopenjdk/openjdk8:alpine-jre +FROM --platform=$TARGETOS/$TARGETARCH adoptopenjdk/openjdk8:alpine-jre LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/dotnet/2.1/Dockerfile b/dotnet/2.1/Dockerfile index f85a2c4..440f50b 100644 --- a/dotnet/2.1/Dockerfile +++ b/dotnet/2.1/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/dotnet/3.1/Dockerfile b/dotnet/3.1/Dockerfile index 1dae74c..f655e82 100644 --- a/dotnet/3.1/Dockerfile +++ b/dotnet/3.1/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/dotnet/5/Dockerfile b/dotnet/5/Dockerfile index 934d73e..2fe9f19 100644 --- a/dotnet/5/Dockerfile +++ b/dotnet/5/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/dotnet/6/Dockerfile b/dotnet/6/Dockerfile index 38307bd..7880a3e 100644 --- a/dotnet/6/Dockerfile +++ b/dotnet/6/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM ghcr.io/parkervcp/yolks:debian +FROM --platform=$TARGETOS/$TARGETARCH ghcr.io/parkervcp/yolks:debian LABEL author="Torsten Widmann" maintainer="info@goover.de" diff --git a/erlang/22/Dockerfile b/erlang/22/Dockerfile index ca64333..c391152 100644 --- a/erlang/22/Dockerfile +++ b/erlang/22/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM erlang:22-alpine +FROM --platform=$TARGETOS/$TARGETARCH erlang:22-alpine LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/erlang/23/Dockerfile b/erlang/23/Dockerfile index 2349293..10d4cd1 100644 --- a/erlang/23/Dockerfile +++ b/erlang/23/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM erlang:23-alpine +FROM --platform=$TARGETOS/$TARGETARCH erlang:23-alpine LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/erlang/24/Dockerfile b/erlang/24/Dockerfile index fff015f..ea47ef4 100644 --- a/erlang/24/Dockerfile +++ b/erlang/24/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM erlang:24-alpine +FROM --platform=$TARGETOS/$TARGETARCH erlang:24-alpine LABEL author="Pascal Zarrad" maintainer="p.zarrad@outlook.de" diff --git a/games/altv/Dockerfile b/games/altv/Dockerfile index a71b4ca..1126862 100644 --- a/games/altv/Dockerfile +++ b/games/altv/Dockerfile @@ -1,7 +1,7 @@ # ---------------------------------- # Environment: debian # ---------------------------------- -FROM node:16-bullseye +FROM --platform=$TARGETOS/$TARGETARCH node:16-bullseye LABEL author="goover" maintainer="info@goover.de" @@ -19,7 +19,7 @@ RUN wget https://packages.microsoft.com/config/debian/11/packages-microsoft- && dpkg -i packages-microsoft-prod.deb \ && apt update -y \ && apt install -y dotnet-sdk-5.0 dotnet-sdk-6.0 libgdiplus - + RUN update-locale lang=en_US.UTF-8 \ && dpkg-reconfigure --frontend noninteractive locales diff --git a/games/samp/Dockerfile b/games/samp/Dockerfile index e1b5ff4..3ed3929 100644 --- a/games/samp/Dockerfile +++ b/games/samp/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM debian:bullseye-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:bullseye-slim LABEL author="QuintenQVD" maintainer="josdekurk@gmail.com" diff --git a/games/source/Dockerfile b/games/source/Dockerfile index 617a9f6..3af65bd 100644 --- a/games/source/Dockerfile +++ b/games/source/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/go/1.14/Dockerfile b/go/1.14/Dockerfile index 105e773..285e36b 100644 --- a/go/1.14/Dockerfile +++ b/go/1.14/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM golang:1.14-alpine +FROM --platform=$TARGETOS/$TARGETARCH golang:1.14-alpine LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/go/1.15/Dockerfile b/go/1.15/Dockerfile index 50a8531..0279ead 100644 --- a/go/1.15/Dockerfile +++ b/go/1.15/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM golang:1.15-alpine +FROM --platform=$TARGETOS/$TARGETARCH golang:1.15-alpine LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/go/1.16/Dockerfile b/go/1.16/Dockerfile index 9855e47..1ab08f3 100644 --- a/go/1.16/Dockerfile +++ b/go/1.16/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM golang:1.16-alpine +FROM --platform=$TARGETOS/$TARGETARCH golang:1.16-alpine LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/installers/alpine/Dockerfile b/installers/alpine/Dockerfile index 0f6b97f..a5b6b81 100644 --- a/installers/alpine/Dockerfile +++ b/installers/alpine/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM alpine:latest +FROM --platform=$TARGETOS/$TARGETARCH alpine:latest LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/installers/debian/Dockerfile b/installers/debian/Dockerfile index e671c61..25168ba 100644 --- a/installers/debian/Dockerfile +++ b/installers/debian/Dockerfile @@ -18,9 +18,9 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# +# -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="Matthew Penner" maintainer="matthew@pterodactyl.io" diff --git a/voice/teaspeak/Dockerfile b/voice/teaspeak/Dockerfile index 809b228..ffa3d3a 100644 --- a/voice/teaspeak/Dockerfile +++ b/voice/teaspeak/Dockerfile @@ -20,7 +20,7 @@ # SOFTWARE. # -FROM --platform=$BUILDPLATFORM debian:stable-slim +FROM --platform=$TARGETOS/$TARGETARCH debian:stable-slim LABEL author="Torsten Widmann" maintainer="info@goover.de" From c13524ceab26a5cf34c3924f0d1416933f044d89 Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Sun, 22 May 2022 19:20:37 -0700 Subject: [PATCH 09/12] Add DayZ to root README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e0ddbbe..a65b567 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,8 @@ is tagged correctly. * `ghcr.io/parkervcp/games:altv` * [`arma3`](/games/arma3) * `ghcr.io/parkervcp/games:arma3` +* [`dayz`](/games/dayz) + * `ghcr.io/parkervcp/games:dayz` * [`samp`](/games/samp) * `ghcr.io/parkervcp/games:samp` * [`source`](/games/source) From 84abe90d35e26ce519d8ab6ff82b8b6815ecc62a Mon Sep 17 00:00:00 2001 From: Red-Thirten Date: Sun, 22 May 2022 19:42:37 -0700 Subject: [PATCH 10/12] Fix Entrypoint contributors --- games/dayz/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/dayz/entrypoint.sh b/games/dayz/entrypoint.sh index 080b372..9460d30 100644 --- a/games/dayz/entrypoint.sh +++ b/games/dayz/entrypoint.sh @@ -2,7 +2,7 @@ ## File: Pterodactyl DayZ SA Image - entrypoint.sh ## Author: David Wolfe (Red-Thirten) -## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/), Stephen White (SilK) +## Contributors: Aussie Server Hosts (https://aussieserverhosts.com/) ## Date: 2022/05/22 ## License: MIT License From 7528d7949fba7877ec495ce38003b339cdd6e2a7 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Tue, 31 May 2022 20:26:18 +0200 Subject: [PATCH 11/12] add tzdata --- wine/latest/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wine/latest/Dockerfile b/wine/latest/Dockerfile index 7ab8e30..36cd688 100644 --- a/wine/latest/Dockerfile +++ b/wine/latest/Dockerfile @@ -1,6 +1,6 @@ -# ---------------------------------- -# Generic Wine 6 image -# ---------------------------------- +# --------------------------------------- +# Generic Wine image based in Wine stable +# --------------------------------------- FROM ghcr.io/parkervcp/yolks:debian LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" @@ -8,7 +8,7 @@ LABEL author="Michael Parker" maintainer="parker@pterodactyl.io" ## install required packages RUN dpkg --add-architecture i386 \ && apt update -y \ - && apt install -y --no-install-recommends gnupg2 software-properties-common libntlm0 winbind xvfb xauth python3 libncurses5:i386 libncurses6:i386 + && apt install -y --no-install-recommends gnupg2 tzdata software-properties-common libntlm0 winbind xvfb xauth python3 libncurses5:i386 libncurses6:i386 # Install winehq-stable and with recommends RUN wget -nc https://dl.winehq.org/wine-builds/winehq.key \ From 1e257e11fc6baef7d15debcee251c12cf3f26638 Mon Sep 17 00:00:00 2001 From: Torsten Widmann Date: Tue, 31 May 2022 20:28:09 +0200 Subject: [PATCH 12/12] typo --- wine/latest/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wine/latest/Dockerfile b/wine/latest/Dockerfile index 36cd688..4c47ef7 100644 --- a/wine/latest/Dockerfile +++ b/wine/latest/Dockerfile @@ -1,5 +1,5 @@ # --------------------------------------- -# Generic Wine image based in Wine stable +# Generic Wine image based on Wine stable # --------------------------------------- FROM ghcr.io/parkervcp/yolks:debian