Merge branch 'master' into devcontainers
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 0000000..5e69f83
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,56 @@
+FROM mcr.microsoft.com/devcontainers/java:17-jdk-bookworm
+
+################### Docker-from-Docker installation ###################
+
+# Install required packages
+RUN apt-get update \
+    && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
+
+# Import the Docker repository GPG key
+RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
+
+# Set permissions on GPG key
+RUN chmod a+r /usr/share/keyrings/docker-archive-keyring.gpg
+
+# Add the Docker repository to the APT sources
+RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+
+# Update package lists and install Docker
+RUN apt-get update \
+    && apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
+    && rm -rf /var/lib/apt/lists/*
+
+# https://github.com/microsoft/vscode-dev-containers/tree/main/containers/docker-from-docker
+ARG NONROOT_USER=vscode
+
+RUN echo -e "#!/bin/sh\n\
+    sudoIf() { if [ \"\$(id -u)\" -ne 0 ]; then sudo \"\$@\"; else \"\$@\"; fi }\n\
+    SOCKET_GID=\$(stat -c '%g' /var/run/docker.sock) \n\
+    if [ \"${SOCKET_GID}\" != '0' ]; then\n\
+        if [ \"\$(cat /etc/group | grep :\${SOCKET_GID}:)\" = '' ]; then sudoIf groupadd --gid \${SOCKET_GID} docker-host; fi \n\
+        if [ \"\$(id ${NONROOT_USER} | grep -E \"groups=.*(=|,)\${SOCKET_GID}\(\")\" = '' ]; then sudoIf usermod -aG \${SOCKET_GID} ${NONROOT_USER}; fi\n\
+    fi\n\
+    exec \"\$@\"" > /usr/local/share/docker-init.sh \
+    && chmod +x /usr/local/share/docker-init.sh
+
+############## End Docker-from-Docker section #############
+
+################### Maven configuration ##################
+
+# Establish .m2 folder and set ownership
+RUN mkdir -p /home/vscode/.m2/repository 
+RUN chown -R vscode:vscode /home/vscode/.m2
+
+################### End Maven section ####################
+
+######### More Docker-from-Docker recommendations ########
+
+# https://github.com/microsoft/vscode-dev-containers/tree/main/containers/docker-from-docker
+# VS Code overrides ENTRYPOINT and CMD when executing `docker run` by default.
+# Setting the ENTRYPOINT to docker-init.sh will configure non-root access to
+# the Docker socket if "overrideCommand": false is set in devcontainer.json.
+# The script will also execute CMD if you need to alter startup behaviors.
+ENTRYPOINT [ "/usr/local/share/docker-init.sh" ]
+CMD [ "sleep", "infinity" ]
+
+######### End Docker-from-Docker recommendations #########
\ No newline at end of file
diff --git a/.devcontainer/jdk17/devcontainer.json b/.devcontainer/jdk17/devcontainer.json
new file mode 100644
index 0000000..b5af16b
--- /dev/null
+++ b/.devcontainer/jdk17/devcontainer.json
@@ -0,0 +1,36 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/java
+{
+	"name": "jdk17",
+	// Explicitly declaring which source-code folder to mount and where to mount it in the container
+	"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
+	"workspaceFolder": "/workspace",
+	"build": {
+		// https://containers.dev/guide/dockerfile
+		"dockerfile": "../Dockerfile"
+	},
+	"features": {
+	},
+	"mounts": [
+		"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind", // Binding the host docker socket to the container
+		"source=m2volume,target=/home/vscode/.m2/repository,type=volume" // Establishing a persistent volume for maven local repository downloads
+	],
+	// Docker-from-Docker recommendations
+	// Per https://github.com/microsoft/vscode-dev-containers/tree/main/containers/docker-from-docker
+	"overrideCommand": false,
+	"remoteUser": "vscode",
+	"runArgs": ["--init"],
+	// End of Docker-from-Docker recommendations
+	"containerEnv": {
+		// You can specify environment variables here, which will be available to the application via System.getenv()
+		"CUSTOM_PROP": "Team"
+	},
+	"postStartCommand": "./mvnw clean package",
+	"customizations": {
+		"vscode": {
+			"extensions": [
+				"vscjava.vscode-java-pack"
+			]
+		}
+	}
+}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a49da10..0e4958d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -5,6 +5,11 @@
         <title>YAML 1.1 parser and emitter</title>
     </properties>
     <body>
+            <release version="2.5" date="in GIT" description="Maintenance">
+            <action dev="asomov" type="update" issue="1105">
+                Introduce devcontainer
+            </action>
+        </release>
         <release version="2.4" date="2025-02-15" description="Maintenance">
             <action dev="maslovalex" type="fix" issue="1101">
                 Add option to log duplicate keys (thanks to Matteo Franci)