{"id":427,"date":"2020-09-07T02:14:01","date_gmt":"2020-09-07T00:14:01","guid":{"rendered":"https:\/\/sascha-brockel.de\/?p=427"},"modified":"2024-01-20T03:08:54","modified_gmt":"2024-01-20T02:08:54","slug":"docker-spring-boot-angular-setup","status":"publish","type":"post","link":"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/","title":{"rendered":"Docker with Spring Boot &amp; Angular"},"content":{"rendered":"<p class=\"yoast-reading-time__wrapper\"><span class=\"yoast-reading-time__icon\"><svg aria-hidden=\"true\" focusable=\"false\" data-icon=\"clock\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" style=\"display:inline-block;vertical-align:-0.1em\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"><\/path><\/svg><\/span><span class=\"yoast-reading-time__spacer\" style=\"display:inline-block;width:1em\"><\/span><span class=\"yoast-reading-time__descriptive-text\">Expected Reading Time:  <\/span><span class=\"yoast-reading-time__reading-time\">8<\/span><span class=\"yoast-reading-time__time-unit\"> minutes<\/span><\/p>\n\n\n\n<div id=\"wp-block-themeisle-blocks-button-group-b48f6f0a\" class=\"wp-block-themeisle-blocks-button-group wp-block-buttons\">\n<div id=\"wp-block-themeisle-blocks-button-37e3803d\" class=\"wp-block-themeisle-blocks-button wp-block-button\"><a href=\"#vorkehrungen\" target=\"_self\" rel=\"noopener noreferrer\" class=\"wp-block-button__link\"><i class=\"fas fa-fw fa-list margin-right\"><\/i><span>Arrangements<\/span><\/a><\/div>\n\n\n\n<div id=\"wp-block-themeisle-blocks-button-ad8d058d\" class=\"wp-block-themeisle-blocks-button wp-block-button\"><a href=\"#frontend\" target=\"_self\" rel=\"noopener noreferrer\" class=\"wp-block-button__link\"><i class=\"fab fa-fw fa-angular margin-right\"><\/i><span>Frontend<\/span><\/a><\/div>\n\n\n\n<div id=\"wp-block-themeisle-blocks-button-ee8b1e7d\" class=\"wp-block-themeisle-blocks-button wp-block-button\"><a href=\"#backend\" target=\"_self\" rel=\"noopener noreferrer\" class=\"wp-block-button__link\"><i class=\"fas fa-fw fa-server margin-right\"><\/i><span>Backend<\/span><\/a><\/div>\n\n\n\n<div id=\"wp-block-themeisle-blocks-button-02e87d29\" class=\"wp-block-themeisle-blocks-button wp-block-button\"><a href=\"#docker\" target=\"_self\" rel=\"noopener noreferrer\" class=\"wp-block-button__link\"><i class=\"fas fa-fw fa-box margin-right\"><\/i><span>Docker<\/span><\/a><\/div>\n\n\n\n<div id=\"wp-block-themeisle-blocks-button-e282dd68\" class=\"wp-block-themeisle-blocks-button wp-block-button\"><a href=\"#fazit\" target=\"_self\" rel=\"noopener noreferrer\" class=\"wp-block-button__link\"><i class=\"fas fa-fw fa-layer-group margin-right\"><\/i><span>Conclusion<\/span><\/a><\/div>\n<\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In the era of microservices, Docker is considered the non plus ultra. Even front-end applications like Angular or back-end applications like Spring Boot (Java) can be easily used in Docker containers. When presenting an application to a larger group, this can come in handy. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When using your own server, the applications can be easily deployed and made available to everyone. This way, everyone can already familiarize themselves with the application during a presentation.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title ez-toc-toggle\" style=\"cursor:pointer\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewbox=\"0 0 24 24\" version=\"1.2\" baseprofile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/#Was_wird_benotigt\" >What is needed?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/#Frontend\" >Frontend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/#Backend\" >Backend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/#Docker\" >Docker<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/#Fazit\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h3 class=\"wp-block-heading\" id=\"vorkehrungen\"><span class=\"ez-toc-section\" id=\"Was_wird_benotigt\"><\/span>What is needed?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For the following example some programs and services are needed:<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Backend<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gradle<\/li>\n\n\n\n<li>Java 8 (JDK)<\/li>\n\n\n\n<li>MySQL 8<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Frontend<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Node.js (version 10.13 or newer)<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Microservice (Docker)<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"frontend\"><span class=\"ez-toc-section\" id=\"Frontend\"><\/span>Frontend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You have to make sure in Angular that you can still set the connections between the Docker containers for deployment. The Docker containers communicate with each other on an internal network and thus have different IPs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is made possible in Docker by environment variables, but you can't use them as easily as, say, Spring Boot by using a <code>@Value<\/code> annotation can set.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Creating the Environment Variables for Use in Angular<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">So to make the whole thing possible a new script must be created in the folder <code>\/assets<\/code> to be created and included. You name the file <code>env.js<\/code> with the following content:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(function (window) {\n  window[\"env\"] = window[\"env\"] || {};\n\n  window[\"env\"][\"apiUrl\"] = \"\/\/localhost:8080\";\n  window[\"env\"][\"debug\"] = true;\n})(this);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The value specified here for <code>apiUrl<\/code> represents the default value if the variable is not set directly by Docker. Here I would like to point out again that all the code in the below in the <a href=\"#fazit\" rel=\"nofollow\">Conclusion<\/a>  linked GitHub repositories.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, in order for the newly created JavaScript to be executed when Angular is launched, you must add it to the <code>index.html<\/code> add<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!doctype html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n  &lt;meta charset=&quot;utf-8&quot;&gt;\n  &lt;title&gt;DockerSpringAngular&lt;\/title&gt;\n  &lt;base href=&quot;\/&quot;&gt;\n  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;\n  &lt;link rel=&quot;icon&quot; type=&quot;image\/x-icon&quot; href=&quot;favicon.ico&quot;&gt;\n  &lt;link href=&quot;https:\/\/fonts.googleapis.com\/css?family=Roboto:300,400,500&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;\n  &lt;link href=&quot;https:\/\/fonts.googleapis.com\/icon?family=Material+Icons&quot; rel=&quot;stylesheet&quot;&gt;\n  &lt;script src=&quot;assets\/env.js&quot;&gt;&lt;\/script&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n  &lt;app-root&gt;&lt;\/app-root&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now you need to modify the actual environment files of Angular to enable setting by Docker with them. To do this, in the folder <code>\/environments<\/code> the <code>environment.ts<\/code> be supplemented as follows. The same should also apply to the <code>environment.prod.ts<\/code> be done for productive operation. However, you must of course ensure that <code>production: true<\/code> is.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export const environment = {\n  production: false,\n  apiUrl: window[\"env\"][\"apiUrl\"] || \"default\",\n  debug: window[\"env\"][\"debug\"] || false,\n};<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Due to this change, the values now come from our previously created script <code>env.js<\/code>. Currently, however, there is still no possibility these <code>apiUrl<\/code> but also dynamically for deployment.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Environment variables template for external definition<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Docker needs a way to access a predefined variable name. To enable this, you also need to create a new variable name in the folder <code>\/assets<\/code> another file named <code>env.template.js<\/code> create. From the basic principle the file looks like the <code>env.js<\/code> only with the difference that we now specify the variable name (here <code>API_URL<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(function(window) {\n  window.env = window.env || {};\n\n  window[\"env\"][\"apiUrl\"] = \"${API_URL}\";\n  window[\"env\"][\"debug\"] = \"${DEBUG}\"\n})(this);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With the command <code>envsubst<\/code> you can then add the variables that are set in the template to the <code>env.js<\/code> insert. So for example with a specification of <code>API_URL: http:\/\/localhost:8080<\/code>. The end result will look like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>envsubst  assets\/env.js<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Internal use in services<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">At <code>user.service.ts<\/code> environment must be imported as a variable and can then be used as a normal declaration. Thus it is possible to access the <code>apiUrl <\/code>and the stored path or address will be used.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { environment } from \"src\/environments\/environment\";\n\nconst USER_API = environment.apiUrl + \"\/api\/user\";\nconst SAVE_USER_API = USER_API + \"\/create\";<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Creation of the Docker image<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">For this you need a Dockerfile. You can also find this in the GitHub repository in the folder <code>docker<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#################\n# Build the app #\n#################\nFROM node:14.5.0-alpine as build\nWORKDIR \/app\nCOPY package.json package-lock.json .\/\nRUN npm install\nCOPY .\nRUN npm install -g @angular\/cli\nRUN ng build --configuration production --output-path=\/dist\n\n################\n# Run in NGINX #\n################\nFROM nginx:alpine\nCOPY --from=build \/dist \/usr\/share\/nginx\/html\nCOPY .\/nginx-custom.conf \/etc\/nginx\/conf.d\/default.conf\n\nEXPOSE 80\n\nCMD [\"\/bin\/sh\", \"-c\", \"envsubst  \/usr\/share\/nginx\/html\/assets\/env.js &amp;&amp; exec nginx -g 'daemon off;'\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">First of all <code>node<\/code> is used as a basis. Then all dependencies of the project are installed and the whole is built directly. The configuration is set to productive mode. Generally, building in advance allows less load for the person who downloads the Docker image and wants to start it. Because nothing has to be built anymore. Above all, this ensures significantly smaller image sizes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I used libraries like Angular Material or FontAwesome, but still only achieved an image size of 10 MB (see <a href=\"https:\/\/hub.docker.com\/r\/saschabrockel\/docker-spring-angular\/tags\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https:\/\/hub.docker.com\/r\/saschabrockel\/docker-spring-angular\/tags<\/a>). Otherwise the entire <code>node_modules<\/code> folders are packed into the image. Thus, sizes of 400-700 MB would be reached quickly.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">NGINX configuration<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">To make the built Angular application now also callable you have to create <code>nginx<\/code> as a web server still configure accordingly. For this purpose the <code>nginx-custom.conf<\/code> (can be found in the frontend folder).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n  listen 80;\n  location \/ {\n    root \/usr\/share\/nginx\/html;\n    index index.html index.htm;\n    try_files $uri $uri\/ \/index.html =404;\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The requests to the URL's are always forwarded, unless the URL does not exist. Then the user is always redirected to the home page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Since you usually want to run a web application via a direct URL without specifying a port, enter the port <code>EXPOSE 80<\/code> on. Finally, the environment variables are overwritten as described above.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With this, all arrangements are now made to connect the Angular frontend to any backend for deployment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"backend\"><span class=\"ez-toc-section\" id=\"Backend\"><\/span>Backend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In Spring Boot, the whole thing is a bit less complicated, since all the prerequisites for dynamically setting variables already exist out of the box. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">REST requests take place via the controller and therefore it must also contain our variable. The whole thing is enabled in the UserController by the <code>@Value<\/code> Annotation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  @Value(\"${angular.service.base-path}\")\n  private String angularServiceBasePath;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This serves only as a small digression, since this is not used in this sample project. However, it has the same function as setting in Angular. Thus, another Spring Boot Server could possibly be addressed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So that the variable can now also be set, the value specified in the <code>@Value<\/code> annotation now also appears in the properties file. <code>application.properties<\/code> can be declared with a default value.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>angular.service.base-path=http:\/\/localhost:4200<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>All<\/strong> itself in <code>application.properties<\/code> can be overwritten in Docker by specifying the corresponding environment variable. Thus also the later in section <a href=\"#docker\">Docker<\/a> necessary declaration of the database connection.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spring.datasource.url=jdbc:mysql:\/\/localhost:3306\/dockerSpringAngular?createDatabaseIfNotExist=true&amp;serverTimezone=UTC<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">CORS configuration<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The last part to consider is the tiresome topic of CORS. Basically, CORS is important for security, but often not so trivial to set up. It determines which web applications from another domain should be able to access the server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">According to my current knowledge, it is unfortunately not possible to set the CORS configuration for deployment as well. This has to be done before building the image. We can find the configuration in the <code>WebSecurityConfig<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  @Bean\n  public CorsFilter corsFilter() {\n    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n    CorsConfiguration config = new CorsConfiguration();\n    config.setAllowCredentials(true);\n    config.setAllowedOrigins(\n        Arrays.asList(\"http:\/\/localhost:4200\", \"http:\/\/localhost\", \"http:\/\/your-domain.com\"));\n    config.setAllowedMethods(Arrays.asList(\"POST\", \"OPTIONS\", \"GET\", \"DELETE\", \"PUT\"));\n    config.setAllowedHeaders(\n        Arrays.asList(\"X-Requested-With\", \"Origin\", \"Content-Type\", \"Accept\", \"Authorization\"));\n    source.registerCorsConfiguration(\"\/**\", config);\n    return new CorsFilter(source);\n  }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Important for our project is the point <code>config.setAllowedOrigins()<\/code>. Hereby we define which domains are now allowed to send a request to the server. In our case actually only <code>localhost:4200<\/code> for the development, then <code>localhost<\/code> for use in Docker on Windows. As an example then also the specification <code>http:\/\/your-domain.com<\/code> from which inquiries could then be sent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Of course, CORS settings can still be made at controller level with the <code>@CrossOrigin<\/code> annotation can be taken. It is important that there is a <code>CorsFilter<\/code> is, since with a <code>CorsConfigurationSource<\/code> the settings do not work for this sample project.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"docker\"><span class=\"ez-toc-section\" id=\"Docker\"><\/span>Docker<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Last but not least, we get to linking and running the whole thing in Docker. I will skip the Dockerfile of the backend in the explanation, because there are no special features there.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Docker Compose<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>  angular:\n    container_name: angular\n    ports:\n      - 80:80\n    image: saschabrockel\/docker-spring-angular:frontend\n    restart: unless-stopped\n    environment:\n      API_URL: http:\/\/localhost:8080\n      TZ: Europe\/Berlin\n    networks:\n      - docker-spring-angular<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Angular section is very trivial. The container runs as long as it is not stopped. The port is as already described in the <a href=\"#frontend\">Frontend<\/a> section mentions 80 in order to not need to specify the port in the browser. Now the environment variable comes into play. <code>API_URL<\/code> is defined and points to the address of the Spring Boot container. The network is used for the exchange between the containers.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  spring-boot:\n    container_name: spring-boot\n    ports:\n      - 8080:8080\n    image: saschabrockel\/docker-spring-angular:backend\n    environment:\n      spring.datasource.url: jdbc:mysql:\/\/db:3306\/dockerSpringAngular\n      spring.datasource.username: brockel\n      spring.datasource.password: develop\n      angular.service.base-path: http:\/\/localhost\n      TZ: Europe\/Berlin\n    depends_on:\n      - db\n    restart: unless-stopped\n    networks:\n      - docker-spring-angular<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Boot looks very similar. Here we then set in the environment mainly the variables that set the database connection. It is important that the variables match those used to create the database.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  db:\n    container_name: db\n    image: mysql:8.0.21\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_DATABASE: dockerSpringAngular\n      MYSQL_USER: brockel\n      MYSQL_PASSWORD: develop\n    ports:\n      - 3306:3306\n    restart: unless-stopped\n    cap_add:\n      - SYS_NICE\n    networks:\n      - docker-spring-angular<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">How to vote <code>spring.datasource.username<\/code> and <code>MYSQL_USER<\/code> so that the connection can be established in the first place. It becomes special again with the exact declaration of the database. <code>MYSQL_DATABASE: dockerSpringAngular<\/code> specifies the name of the database. But to use it then we have to specify the corresponding <code>spring.datasource.url<\/code> adjust. Here is a comparison of the line in <code>application.properties<\/code> and in the <code>docker-compose.yml<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spring.datasource.url=jdbc:mysql:\/\/localhost:3306\/dockerSpringAngular?createDatabaseIfNotExist=true&amp;serverTimezone=UTC\nspring.datasource.url: jdbc:mysql:\/\/db:3306\/dockerSpringAngular\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of <code>localhost<\/code> we now enter the name of the database container (<code>db<\/code>) to establish the connection. In addition, the other Docker-level attributes are dropped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is to note that with the current docker-compose.yml, no data is stored as no volumes have been specified.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fazit\"><span class=\"ez-toc-section\" id=\"Fazit\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now you have learned how to deploy Angular to Docker using Spring Boot. Here how to define each API endpoint when defining Docker services and what customizations need to be made for this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once the prerequisites are in place, it is easy to make adjustments to the deployment such as changing the server. Feel free to try it out for yourself.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large ticss-59cba092\"><a href=\"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?ssl=1\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" width=\"750\" height=\"143\" src=\"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?resize=750%2C143&#038;ssl=1\" alt=\"User overview of the sample application\" class=\"wp-image-532\" srcset=\"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?resize=300%2C57&amp;ssl=1 300w, https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?resize=768%2C146&amp;ssl=1 768w, https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?resize=1536%2C293&amp;ssl=1 1536w, https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/09\/Docker-Spring-Angular-Anwendung-1.png?resize=16%2C3&amp;ssl=1 16w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/a><figcaption class=\"wp-element-caption\"><strong>Example application<\/strong><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The whole thing should then look like this in the browser. In the individual project folders of the GitHub repository you will find README's with documentation and DeepL access to individual files.<br>Source for setting the Angular variables: <a href=\"https:\/\/pumpingco.de\/blog\/environment-variables-angular-docker\/\">https:\/\/pumpingco.de\/blog\/environment-variables-angular-docker\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can find the complete source code on <a href=\"https:\/\/github.com\/saschabrockel\/docker-spring-angular\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>. <br>The Docker images are available in the <a href=\"https:\/\/hub.docker.com\/r\/saschabrockel\/docker-spring-angular\" target=\"_blank\" rel=\"noreferrer noopener\">DockerHub<\/a>.<\/p>\n\n\n\n<div id=\"jp-block-themeisle-blocks-font-awesome-icons-8c6d8bc1\" class=\"wp-block-themeisle-blocks-font-awesome-icons jp-block-themeisle-blocks-font-awesome-icons\"><span class=\"wp-block-themeisle-blocks-font-awesome-icons-container\"><a href=\"https:\/\/sascha-brockel.de\/en\/#contact\" target=\"_self\" rel=\"noopener noreferrer\"><i class=\"fas fa-business-time\"><\/i><\/a><\/span><\/div>\n\n\n\n<h4 id=\"jp-block-themeisle-blocks-advanced-heading-baa7fa4c\" class=\"wp-block-themeisle-blocks-advanced-heading jp-block-themeisle-blocks-advanced-heading-baa7fa4c jp-block-themeisle-blocks-advanced-heading ticss-116fe371\">Interested, but lack time or knowledge?<\/h4>\n\n\n\n<p id=\"jp-block-themeisle-blocks-advanced-heading-16f35f43\" class=\"wp-block-themeisle-blocks-advanced-heading jp-block-themeisle-blocks-advanced-heading-16f35f43 jp-block-themeisle-blocks-advanced-heading ticss-0e2b851d\">No problem. Contact me and we will discuss your requirements. No matter if business or private.<\/p>\n\n\n\n<div id=\"jp-block-themeisle-blocks-button-group-77e0455a\" class=\"wp-block-themeisle-blocks-button-group wp-block-buttons align-center jp-block-themeisle-blocks-button-group jp-block-buttons\">\n<div id=\"jp-block-themeisle-blocks-button-c6fb3687\" class=\"wp-block-themeisle-blocks-button wp-block-button jp-block-themeisle-blocks-button jp-block-button\"><a href=\"https:\/\/sascha-brockel.de\/en\/#contact\" target=\"_self\" rel=\"noopener noreferrer\" class=\"wp-block-button__link\"><i class=\"fas fa-fw fa-phone-volume margin-right\"><\/i><span>Contact<\/span><\/a><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>In der Zeit der Microservices gilt Docker als Non plus ultra. Auch Frontend Anwendungen wie Angular oder Backend Anwendungen wie Spring Boot (Java) lassen sich einfach in Docker Containern nutzen. Bei der Pr\u00e4sentation einer Anwendung vor einer gr\u00f6\u00dferen Gruppe kann Ihnen dies n\u00fctzlich sein. Bei der Verwendung eines eigenen Servers [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":479,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[15],"tags":[17,16,18],"class_list":["post-427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","tag-angular","tag-docker","tag-spring-boot"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.7 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Docker mit Spring Boot &amp; Angular - Sascha Brockel<\/title>\n<meta name=\"description\" content=\"Docker mit Spring Boot und Angular als Webanwendung deployen leicht gemacht. Perfekt f\u00fcr h\u00e4ufige \u00c4nderungen auf der Infrastrukturebene.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker mit Spring Boot &amp; Angular\" \/>\n<meta property=\"og:description\" content=\"Docker mit Spring Boot und Angular als Webanwendung deployen leicht gemacht. Perfekt f\u00fcr h\u00e4ufige \u00c4nderungen auf der Infrastrukturebene.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/\" \/>\n<meta property=\"og:site_name\" content=\"Sascha Brockel\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-07T00:14:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-20T02:08:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-3136x2268.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"3136\" \/>\n\t<meta property=\"og:image:height\" content=\"2268\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sascha Brockel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@saschabrockel\" \/>\n<meta name=\"twitter:site\" content=\"@saschabrockel\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sascha Brockel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/\"},\"author\":{\"name\":\"Sascha Brockel\",\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/#\\\/schema\\\/person\\\/3675ac2cf16fa04c60aca4dedca5c970\"},\"headline\":\"Docker mit Spring Boot &#038; Angular\",\"datePublished\":\"2020-09-07T00:14:01+00:00\",\"dateModified\":\"2024-01-20T02:08:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/\"},\"wordCount\":1357,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/#\\\/schema\\\/person\\\/3675ac2cf16fa04c60aca4dedca5c970\"},\"image\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2020\\\/08\\\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1\",\"keywords\":[\"Angular\",\"Docker\",\"Spring Boot\"],\"articleSection\":[\"Docker\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#respond\"]}],\"copyrightYear\":\"2020\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/en\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/\",\"url\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/\",\"name\":\"Docker mit Spring Boot & Angular - Sascha Brockel\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2020\\\/08\\\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1\",\"datePublished\":\"2020-09-07T00:14:01+00:00\",\"dateModified\":\"2024-01-20T02:08:54+00:00\",\"description\":\"Docker mit Spring Boot und Angular als Webanwendung deployen leicht gemacht. Perfekt f\u00fcr h\u00e4ufige \u00c4nderungen auf der Infrastrukturebene.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2020\\\/08\\\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2020\\\/08\\\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1\",\"width\":4032,\"height\":2916,\"caption\":\"Docker Container\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/docker-spring-boot-angular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/sascha-brockel.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker mit Spring Boot &#038; Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/#website\",\"url\":\"https:\\\/\\\/sascha-brockel.de\\\/\",\"name\":\"Sascha Brockel\",\"description\":\"Fortschritt kennt keine Grenzen\",\"publisher\":{\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/#\\\/schema\\\/person\\\/3675ac2cf16fa04c60aca4dedca5c970\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sascha-brockel.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/sascha-brockel.de\\\/#\\\/schema\\\/person\\\/3675ac2cf16fa04c60aca4dedca5c970\",\"name\":\"Sascha Brockel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1\",\"width\":709,\"height\":945,\"caption\":\"Sascha Brockel\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/sascha-brockel.de\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1\"},\"sameAs\":[\"https:\\\/\\\/sascha-brockel.de\\\/\",\"https:\\\/\\\/www.instagram.com\\\/saschabrockel\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/sascha-brockel-b20725164\\\/\",\"https:\\\/\\\/x.com\\\/saschabrockel\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCogo25FboCahP7s8--HDuIQ\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker with Spring Boot &amp; Angular - Sascha Brockel","description":"Docker with Spring Boot and Angular deployed as a web application made easy. Perfect for frequent changes at the infrastructure level.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/","og_locale":"en_US","og_type":"article","og_title":"Docker mit Spring Boot & Angular","og_description":"Docker mit Spring Boot und Angular als Webanwendung deployen leicht gemacht. Perfekt f\u00fcr h\u00e4ufige \u00c4nderungen auf der Infrastrukturebene.","og_url":"https:\/\/sascha-brockel.de\/en\/docker-spring-boot-angular-setup\/","og_site_name":"Sascha Brockel","article_published_time":"2020-09-07T00:14:01+00:00","article_modified_time":"2024-01-20T02:08:54+00:00","og_image":[{"width":3136,"height":2268,"url":"https:\/\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-3136x2268.jpg","type":"image\/jpeg"}],"author":"Sascha Brockel","twitter_card":"summary_large_image","twitter_creator":"@saschabrockel","twitter_site":"@saschabrockel","twitter_misc":{"Written by":"Sascha Brockel","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#article","isPartOf":{"@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/"},"author":{"name":"Sascha Brockel","@id":"https:\/\/sascha-brockel.de\/#\/schema\/person\/3675ac2cf16fa04c60aca4dedca5c970"},"headline":"Docker mit Spring Boot &#038; Angular","datePublished":"2020-09-07T00:14:01+00:00","dateModified":"2024-01-20T02:08:54+00:00","mainEntityOfPage":{"@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/"},"wordCount":1357,"commentCount":0,"publisher":{"@id":"https:\/\/sascha-brockel.de\/#\/schema\/person\/3675ac2cf16fa04c60aca4dedca5c970"},"image":{"@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1","keywords":["Angular","Docker","Spring Boot"],"articleSection":["Docker"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#respond"]}],"copyrightYear":"2020","copyrightHolder":{"@id":"https:\/\/sascha-brockel.de\/en\/#organization"}},{"@type":"WebPage","@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/","url":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/","name":"Docker with Spring Boot &amp; Angular - Sascha Brockel","isPartOf":{"@id":"https:\/\/sascha-brockel.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#primaryimage"},"image":{"@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1","datePublished":"2020-09-07T00:14:01+00:00","dateModified":"2024-01-20T02:08:54+00:00","description":"Docker with Spring Boot and Angular deployed as a web application made easy. Perfect for frequent changes at the infrastructure level.","breadcrumb":{"@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#primaryimage","url":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1","contentUrl":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1","width":4032,"height":2916,"caption":"Docker Container"},{"@type":"BreadcrumbList","@id":"https:\/\/sascha-brockel.de\/docker-spring-boot-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/sascha-brockel.de\/"},{"@type":"ListItem","position":2,"name":"Docker mit Spring Boot &#038; Angular"}]},{"@type":"WebSite","@id":"https:\/\/sascha-brockel.de\/#website","url":"https:\/\/sascha-brockel.de\/","name":"Sascha Brockel","description":"Progress knows no boundaries","publisher":{"@id":"https:\/\/sascha-brockel.de\/#\/schema\/person\/3675ac2cf16fa04c60aca4dedca5c970"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sascha-brockel.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/sascha-brockel.de\/#\/schema\/person\/3675ac2cf16fa04c60aca4dedca5c970","name":"Sascha Brockel","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2023\/10\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1","url":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2023\/10\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1","contentUrl":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2023\/10\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1","width":709,"height":945,"caption":"Sascha Brockel"},"logo":{"@id":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2023\/10\/Brockel_Sascha_3_3zu4-Grau.png?fit=709%2C945&ssl=1"},"sameAs":["https:\/\/sascha-brockel.de\/","https:\/\/www.instagram.com\/saschabrockel\/","https:\/\/www.linkedin.com\/in\/sascha-brockel-b20725164\/","https:\/\/x.com\/saschabrockel","https:\/\/www.youtube.com\/channel\/UCogo25FboCahP7s8--HDuIQ"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/sascha-brockel.de\/wp-content\/uploads\/2020\/08\/Docker-Container-scaled.jpg?fit=4032%2C2916&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/posts\/427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/comments?post=427"}],"version-history":[{"count":2,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/posts\/427\/revisions"}],"predecessor-version":[{"id":1263,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/posts\/427\/revisions\/1263"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/media\/479"}],"wp:attachment":[{"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/media?parent=427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/categories?post=427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sascha-brockel.de\/en\/wp-json\/wp\/v2\/tags?post=427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}