{"id":1837,"date":"2025-03-19T04:02:32","date_gmt":"2025-03-19T04:02:32","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/03\/19\/leveraging-docker-with-tensorflow-models-tensorflow-js-for-a-snake-ai-game\/"},"modified":"2025-03-19T04:02:32","modified_gmt":"2025-03-19T04:02:32","slug":"leveraging-docker-with-tensorflow-models-tensorflow-js-for-a-snake-ai-game","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/03\/19\/leveraging-docker-with-tensorflow-models-tensorflow-js-for-a-snake-ai-game\/","title":{"rendered":"Leveraging Docker with TensorFlow Models &amp; TensorFlow.js for a Snake AI Game"},"content":{"rendered":"<p class=\"has-text-align-left\">The emergence of containerization has brought about a significant transformation in software development and deployment by providing a consistent and scalable environment on many platforms. For developers trying to optimize their operations, Docker in particular has emerged as the preferred technology.\u00a0 By using containers as the foundation, developers gain the same key benefits \u2014 portability, scalability, efficiency, and security \u2014 that they rely on for other workloads, seamlessly extending them to ML and AI applications. Using a real-world example involving a Snake AI game, we\u2019ll examine in this article how TensorFlow.js can be used with Docker to run AI\/ML in a web browser.<\/p>\n<h2 class=\"wp-block-heading\">Why Docker for TensorFlow.js conversion?<\/h2>\n<p>With the help of TensorFlow.js, a robust toolkit, machine learning models can be executed in a web browser, opening up a plethora of possibilities for applications such as interactive demonstrations and real-time inference. Docker offers a sophisticated solution by guaranteeing consistency and user-friendliness throughout the conversion process by enclosing it inside a container.<\/p>\n<h2 class=\"wp-block-heading\">The Snake AI neural network game<\/h2>\n<p>The <strong>Snake AI game<\/strong> brings a modern twist to the classic Snake game by integrating artificial intelligence that learns and improves its gameplay over time. In this version, you can either play manually using arrow keys or let the AI take control.\u00a0<\/p>\n<p>The AI running with <strong>TensorFlow<\/strong> continuously improves by making strategic movements to maximize the score while avoiding collisions. The game runs in a browser using <strong>TensorFlow.js<\/strong>, allowing you to test different trained models and observe how the AI adapts to various challenges.\u00a0<\/p>\n<p>Whether you\u2019re playing for fun or experimenting with AI models, this game is a great way to explore the intersection of gaming and machine learning. In our approach, we\u2019ve used the neural network to play the traditional Snake game.<\/p>\n<p>Before we dive into the AI in this Snake game, let\u2019s understand the basics of a neural network.<\/p>\n<h2 class=\"wp-block-heading\">What is a neural network?<\/h2>\n<p>A <strong>neural network<\/strong> is a type of machine learning model inspired by the way the human brain works. It\u2019s made up of layers of nodes (or \u201cneurons\u201d), where each node takes some inputs, processes them, and passes an output to the next layer.<\/p>\n<p><strong>Key components of a neural network:<\/strong><\/p>\n<p><strong>Input layer: <\/strong>Receives the raw data (in our game, the snake\u2019s surroundings).<\/p>\n<p><strong>Hidden layers: <\/strong>Process the input and extract patterns.<\/p>\n<p><strong>Output layer: <\/strong>Gives the final prediction<\/p>\n<p><strong>Figure 1: Key components of a<\/strong> <strong>neural network<\/strong><\/p>\n<p>Imagine each neuron as a small decision-maker. The more neurons and layers, the better the network can recognize patterns.<\/p>\n<h2 class=\"wp-block-heading\">Types of neural networks<\/h2>\n<p>There are several types of neural networks, each suited for different tasks!<\/p>\n<p><strong>Feedforward Neural Networks (FNNs):<\/strong><\/p>\n<p>The simplest type, where data flows in one direction, from input to output.<\/p>\n<p>Great for tasks like classification, regression, and pattern recognition.<\/p>\n<p><strong>Convolutional Neural Networks (CNNs):<\/strong><\/p>\n<p>Designed to work with image data.<\/p>\n<p>Uses filters to detect spatial patterns, like edges or textures.<\/p>\n<p><strong>Recurrent Neural Networks (RNNs)<\/strong><\/p>\n<p>Good for sequence prediction (e.g., stock prices, text generation).<\/p>\n<p>Remembers previous inputs, allowing it to handle time-series data.<\/p>\n<p><strong>Long Short-Term Memory Networks (LSTMs)<\/strong><\/p>\n<p>A specialized type of RNN that can learn long-term dependencies.<\/p>\n<p><strong>Generative Adversarial Networks (GANs)<\/strong><\/p>\n<p>Used for generating new data, such as creating images or deepfakes.<\/p>\n<h2 class=\"wp-block-heading\">When to use each type:<\/h2>\n<p><strong>CNNs:<\/strong> Image classification, object detection, facial recognition.<\/p>\n<p><strong>RNNs\/LSTMs:<\/strong> Language models, stock market prediction, time-series data.<\/p>\n<p><strong>FNNs:<\/strong> Games like Snake, where the task is to predict the next action based on the current state.<\/p>\n<h2 class=\"wp-block-heading\">How does the game work?<\/h2>\n<p>The snake game offers two ways to play:<\/p>\n<p><strong>Manual mode:<\/strong><\/p>\n<p>You control the snake using your keyboard\u2019s arrow keys.<\/p>\n<p>The goal is to eat the fruit (red square) without hitting the walls or yourself.<\/p>\n<p>Every time you eat a fruit, the snake grows longer, and your score increases.<\/p>\n<p>If the snake crashes, the game ends, and you can restart to try again.<\/p>\n<p><strong>AI mode:<\/strong><\/p>\n<p>The game plays itself using a neural network (a type of AI brain) built with TensorFlow.js.<\/p>\n<p>The AI looks at the snake\u2019s surroundings (walls, fruit location, and snake body) and predicts the best move: left, forward, or right.<\/p>\n<p>After each game, the AI learns from its mistakes and becomes smarter over time.<\/p>\n<p>With enough training, the AI can avoid crashing and improve its score.<\/p>\n<p class=\"has-text-align-left\"><strong>Figure 2: The classic Nokia snake game with an AI twist<\/strong><\/p>\n<p class=\"has-text-align-left\">Getting started<\/p>\n<p>Let\u2019s go through how this game is built step by step. You\u2019ll first need to install Docker to run the game in a web browser. Here\u2019s a summary of the steps.\u00a0<\/p>\n<p>Clone the repository<\/p>\n<p>Install Docker Desktop<\/p>\n<p>Create a Dockerfile<\/p>\n<p>Build the Docker image<\/p>\n<p>Run the container<\/p>\n<p>Access the game using the web browser<\/p>\n<h2 class=\"wp-block-heading\">Cloning the repository<\/h2>\n<p>git clone https:\/\/github.com\/dockersamples\/snake-game-tensorflow-docker<\/p>\n<h2 class=\"wp-block-heading\">Install Docker Desktop<\/h2>\n<p><strong>Prerequisites:<\/strong><\/p>\n<p>A supported version of Mac, Linux, or Windows<\/p>\n<p>At least 4 GB RAM<\/p>\n<p><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">Click here<\/a> to download Docker Desktop. Select the version appropriate for your system (Apple Silicon or Intel chip for Mac users, Windows, or Linux distribution)<\/p>\n<p><strong>Figure 3: Download Docker Desktop from the Docker website for your machine<\/strong><\/p>\n<h2 class=\"wp-block-heading\">Quick run<\/h2>\n<p>After installing Docker Desktop, run the pre-built Docker image and<strong> <\/strong>execute the following command in your command prompt. It\u2019ll pull the image and start a new container running the <strong>snake-game:v1<\/strong> Docker image and expose port <strong>8080<\/strong> on the host machine.\u00a0<\/p>\n<p>Run the following command to bring up the application:<\/p>\n<p>docker compose up<\/p>\n<p>Next, open the browser and go to <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\">http:\/\/localhost:8080<\/a> to see the output of the snake game and start your first game.<\/p>\n<p><strong>Why use Docker to run the snake game?<\/strong><\/p>\n<p>No need to install Nginx on your machine \u2014 Docker handles it.<\/p>\n<p>The game runs the same way on any system that supports Docker.<\/p>\n<p>You can easily share your game as a Docker image, and others can run it with a single command.<\/p>\n<h2 class=\"wp-block-heading\">The game logic<\/h2>\n<p>The index.html file acts as the foundation of the game, defining the layout and structure of the webpage. It fetches the library <strong>TensorFlow.js<\/strong>, which powers the AI, along with script.js for handling gameplay logic and ai.js for AI-based movements. The game UI is simple yet functional, featuring a <strong>mode selector<\/strong> that lets players switch between manual control (using arrow keys) and AI mode. The <strong>scoreboard<\/strong> dynamically updates the score, high score, and generation count when the AI is training. Also, the game itself runs on an HTML &lt;canvas&gt; element, making it highly interactive. As we move forward, we\u2019ll explore how the JavaScript files bring this game to life!<\/p>\n<p>File : <a href=\"https:\/\/github.com\/dockersamples\/snake-game-tensorflow-docker\/blob\/main\/index.html\" target=\"_blank\">index.html<\/a><\/p>\n<p>The HTML file sets up the structure of the game, like the game canvas and control buttons. It also fetches the library from Tensorflow which will be further used by the code to train the snake.\u00a0<\/p>\n<p><strong>Canvas:<\/strong> Where the game is drawn.<\/p>\n<p><strong>Mode Selector:<\/strong> Lets you switch between manual and AI gameplay.<\/p>\n<p><strong>TensorFlow.js:<\/strong> The library that powers the AI brain!<\/p>\n<p>File : <a href=\"https:\/\/github.com\/dockersamples\/snake-game-tensorflow-docker\/blob\/main\/script.js\" target=\"_blank\">script.js<\/a><\/p>\n<p>This file handles everything in the game\u2014drawing the board, moving the snake, placing the fruit, and keeping score.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nconst canvas = document.getElementById(&#8216;gameCanvas&#8217;);<br \/>\nconst ctx = canvas.getContext(&#8216;2d&#8217;);\n<p>let snake = [{ x: 5, y: 5 }];<br \/>\nlet fruit = { x: 10, y: 10 };<br \/>\nlet direction = { x: 1, y: 0 };<br \/>\nlet score = 0;\n<\/p><\/div>\n<p><strong>Snake Position:<\/strong> Where the snake starts.<\/p>\n<p><strong>Fruit Position:<\/strong> Where the apple is.<\/p>\n<p><strong>Direction:<\/strong> Which way the snake is moving.<\/p>\n<h3 class=\"wp-block-heading\">The game loop<\/h3>\n<p>The game loop keeps the game running, updating the snake\u2019s position, checking for collisions, and handling the score.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nfunction gameLoopManual() {<br \/>\n    const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y };\n<p>    if (head.x === fruit.x &amp;&amp; head.y === fruit.y) {<br \/>\n        score++;<br \/>\n        fruit = placeFruit();<br \/>\n    } else {<br \/>\n        snake.pop();<br \/>\n    }<br \/>\n    snake.unshift(head);<br \/>\n}\n<\/p><\/div>\n<p><strong>Moving the Snake:<\/strong> Adds a new head to the snake and removes the tail (unless it eats an apple).<\/p>\n<p><strong>Collision:<\/strong> If the head hits the wall or its own body, the game ends.<\/p>\n<h3 class=\"wp-block-heading\">Switching between modes<\/h3>\n<div class=\"wp-block-syntaxhighlighter-code \">\ndocument.getElementById(&#8216;mode&#8217;).addEventListener(&#8216;change&#8217;, function() {<br \/>\n    gameMode = this.value;<br \/>\n});\n<\/div>\n<p><strong>Manual Mode:<\/strong> Use arrow keys to control the snake.<\/p>\n<p><strong>AI Mode:<\/strong> The neural network predicts the next move.<\/p>\n<h3 class=\"wp-block-heading\">Game over and restart<\/h3>\n<div class=\"wp-block-syntaxhighlighter-code \">\nfunction gameOver() {<br \/>\n    clearInterval(gameInterval);<br \/>\n    alert(&#8216;Game Over&#8217;);<br \/>\n}\n<p>function resetGame() {<br \/>\n    score = 0;<br \/>\n    snake = [{ x: 5, y: 5 }];<br \/>\n    fruit = placeFruit();<br \/>\n}\n<\/p><\/div>\n<p><strong>Game Over:<\/strong> Stops the game when the snake crashes.<\/p>\n<p><strong>Reset:<\/strong> Resets the game back to the beginning.<\/p>\n<h2 class=\"wp-block-heading\">Training the AI<\/h2>\n<p>File : <a href=\"https:\/\/github.com\/harsh4870\/Snake-AI-TensorFlow-Docker\/blob\/main\/ai.js\" target=\"_blank\">ai.js<\/a><\/p>\n<p>This file creates and trains the neural network \u2014 the AI brain that learns how to play Snake!<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nvar movementOptions = [&#8216;left&#8217;, &#8216;forward&#8217;, &#8216;right&#8217;];\n<p>const neuralNet = tf.sequential();<br \/>\nneuralNet.add(tf.layers.dense({units: 256, inputShape: [5]}));<br \/>\nneuralNet.add(tf.layers.dense({units: 512}));<br \/>\nneuralNet.add(tf.layers.dense({units: 256}));<br \/>\nneuralNet.add(tf.layers.dense({units: 3}));\n<\/p><\/div>\n<p><strong>Neural Network:<\/strong> This is a simulated brain with four layers of neurons.<\/p>\n<p><strong>Input:<\/strong> Information about the game state (walls, fruit position, snake body).<\/p>\n<p><strong>Output:<\/strong> One of three choices: turn left, go forward, or turn right.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nconst optAdam = tf.train.adam(.001);<br \/>\nneuralNet.compile({<br \/>\n  optimizer: optAdam,<br \/>\n  loss: &#8216;meanSquaredError&#8217;<br \/>\n});\n<\/div>\n<p><strong>Optimizer:<\/strong> Helps the brain learn efficiently by adjusting its weights.<\/p>\n<p><strong>Loss Function:<\/strong> Measures how wrong the AI\u2019s predictions are, helping it improve.<\/p>\n<p>Every time the snake plays a game, it remembers its moves and trains itself.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nasync function trainNeuralNet(moveRecord) {<br \/>\n  for (var i = 0; i &lt; moveRecord.length; i++) {<br \/>\n     const expected = tf.oneHot(tf.tensor1d([deriveExpectedMove(moveRecord[i])], &#8216;int32&#8217;), 3).cast(&#8216;float32&#8217;);<br \/>\n     posArr = tf.tensor2d([moveRecord[i]]);<br \/>\n     await neuralNet.fit(posArr, expected, { batchSize: 3, epochs: 1 });<br \/>\n     expected.dispose();<br \/>\n     posArr.dispose();<br \/>\n  }<br \/>\n}\n<\/div>\n<p>After each game, the AI looks at what happened, adjusts its internal connections, and tries to improve for the next game.<\/p>\n<p>The movementOptions array defines the possible movement directions for the snake: \u2018left\u2019, \u2018forward\u2019, and \u2018right\u2019.<\/p>\n<p>An Adam optimizer with a learning rate of 0.001 compiles the model, and a mean squared error loss function is specified. The trainNeuralNet function is defined to train the neural network using a given moveRecord array. It iterates over the moveRecord array, creates one-hot encoded tensors for the expected movement, and trains the model using the TensorFlow.js fit method.<\/p>\n<h2 class=\"wp-block-heading\">Predicting the next move<\/h2>\n<p>When playing, the AI predicts what the best move should be.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nfunction computePrediction(input) {<br \/>\n  let inputs = tf.tensor2d([input]);<br \/>\n  const outputs = neuralNet.predict(inputs);<br \/>\n  return movementOptions[outputs.argMax(1).dataSync()[0]];<br \/>\n}\n<\/div>\n<p>The  computePrediction function makes predictions using the trained neural network. It takes an input array, creates a tensor from the input, predicts the movement using the neural network, and returns the movement option based on the predicted output.<\/p>\n<p>The code demonstrates the creation of a neural network model, training it with a given move record, and making predictions using the trained model. This approach can enhance the snake AI game\u2019s performance and intelligence by learning from its history and making informed decisions.<\/p>\n<p>File : <a href=\"https:\/\/github.com\/harsh4870\/Snake-AI-TensorFlow-Docker\/blob\/main\/Dockerfile\" target=\"_blank\">Dockerfile<\/a><\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nFROM nginx:latest<br \/>\nCOPY . \/usr\/share\/nginx\/html\n<\/div>\n<p><strong>FROM nginx:latest<\/strong><\/p>\n<p>This tells Docker to use the latest version of <strong>Nginx<\/strong> as the base image.<\/p>\n<p><strong>Nginx<\/strong> is a web server that\u2019s great for serving static files like HTML, CSS, and JavaScript ( (which is what the Snake game is made of).<\/p>\n<p>Instead of creating a server from scratch, the following line saves time by using an existing, reliable Nginx setup.<\/p>\n<p><strong>COPY . \/usr\/share\/nginx\/html<\/strong><\/p>\n<p>This line copies everything from your current project directory (the one with the Snake game files: index.html, script.js, ai.js, etc.) into the Nginx web server\u2019s default folder for serving web content.<\/p>\n<p>\/usr\/share\/nginx\/html is the default folder where Nginx looks for web files to display.<\/p>\n<h2 class=\"wp-block-heading\">Development setup<\/h2>\n<p>Here\u2019s how you can set up the development environment for the Snake game using Docker!<\/p>\n<p>To make the development smoother, you can use <a href=\"https:\/\/docs.docker.com\/engine\/storage\/volumes\/\" target=\"_blank\"><strong>Docker Volume<\/strong>s<\/a> to avoid rebuilding the Docker image every time you change the game files.\u00a0<\/p>\n<p>Run the command from the folder where Snake-AI-TensorFlow-Docker code exists:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\ndocker run -it &#8211;rm -d -p 8080:80 &#8211;name web -v .\/:\/usr\/share\/nginx\/html nginx\n<\/div>\n<p>If you hit an error like<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\ndocker: Error response from daemon: Mounts denied:<br \/>\nThe path \/Users\/harsh\/Downloads\/Snake-AI-TensorFlow-Docker is not shared from the host and is not known to Docker.<br \/>\nYou can configure shared paths from Docker -&gt; Preferences&#8230; -&gt; Resources -&gt; File Sharing.<br \/>\nSee https:\/\/docs.docker.com\/desktop\/settings\/mac\/#file-sharing for more info.\n<\/div>\n<p>Open Docker Desktop, go to Settings -&gt; Resources -&gt; File Sharing -&gt; Select the location where you cloned the repository code, and click on <strong>Apply &amp; restart<\/strong>.<\/p>\n<p><strong>Figure 4: Using Docker Desktop to set up a development environment for the AI snake game<\/strong><\/p>\n<p>Run the command again, you won\u2019t face any errors now\u00a0<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\ndocker run -it &#8211;rm -d -p 8080:80 &#8211;name web -v .\/:\/usr\/share\/nginx\/html nginx\n<\/div>\n<p>Check if the container is running with the following command<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nharsh@Harshs-MacBook-Air snake-game-tensorflow-docker % docker ps<br \/>\nCONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES<br \/>\nc47e2711b2db   nginx     &#8220;\/docker-entrypoint.\u2026&#8221;   3 seconds ago   Up 2 seconds   0.0.0.0:8080-&gt;80\/tcp   web\n<\/div>\n<p>Open the browser and go to the URL <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\">http:\/\/localhost:8080<\/a>, you\u2019ll see the snake game output. This setup is perfect for development because it keeps everything fast and dynamic.\u00a0<\/p>\n<p><strong>Figure 5: Accessing the snake game via a web browser.<\/strong><\/p>\n<p>Changes in the code will be reflected right away in the browser without rebuilding the container<strong>-v ~\/.:\/usr\/share\/nginx\/html<\/strong> \u2014 This is the magic part! It mounts your local directory (Snake-AI-TensorFlow-Docker) into the Nginx HTML directory (\/usr\/share\/nginx\/html) inside the container.<\/p>\n<p>Any changes you make to HTML, CSS, or JavaScript files in code ~\/Snake-AI-TensorFlow-Docker immediately reflect in the running app without needing to rebuild the container.<\/p>\n<h2 class=\"wp-block-heading\">Conclusion\u00a0<\/h2>\n<p>In conclusion, building a Snake AI game using TensorFlow.js and Docker demonstrates how seamlessly ML and AI can be integrated into interactive web applications. Through this project, we\u2019ve not only explored the fundamentals of reinforcement learning but also seen firsthand how Docker can simplify the development and deployment process.<\/p>\n<p>By containerizing, Docker ensures a consistent environment across different systems, eliminating the common \u201cit works on my machine\u201d problem. This consistency makes it easier to collaborate with others, deploy to production, and manage dependencies without worrying about version mismatches or local configuration issues for web applications, machine learning projects, or AI applications.<\/p>","protected":false},"excerpt":{"rendered":"<p>The emergence of containerization has brought about a significant transformation in software development and deployment by providing a consistent and [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[4],"tags":[],"class_list":["post-1837","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/1837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=1837"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/1837\/revisions"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=1837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=1837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=1837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}