Skip to content

Commit 0f362a2

Browse files
committed
🌁
1 parent 67533e1 commit 0f362a2

16 files changed

Lines changed: 8 additions & 8 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!doctype html><html lang=en-US><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Cloud Native Go Tutorials for Everyone!"><meta name=author content="Dumindu Madunuwan"><meta name=theme-color content="#ffffff" media="(prefers-color-scheme: light)"><meta name=theme-color content="#101010" media="(prefers-color-scheme: dark)"><title>Building a Dockerized RESTful API application in Go Β· Learning Cloud Native Go</title>
2-
<link rel=canonical href=https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/><link rel=stylesheet href=/assets/css/docs.min.8e9408609771a441499aa5571a4585b0ca95783b842d5c758af5eef1457b0fe0.css integrity><link rel=manifest href=/manifest.json><link rel=icon href=/favicon/favicon.ico><link rel=icon href=/favicon/favicon-16x16.png sizes=16x16 type=image/png><link rel=icon href=/favicon/favicon-32x32.png sizes=32x32 type=image/png><link rel=apple-touch-icon href=/favicon/apple-touch-icon.png sizes=180x180><script async src="https://www.googletagmanager.com/gtag/js?id=G-H3GD0XFJ42"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-H3GD0XFJ42")</script></head><body><div id=outer-wrapper><div id=aside-wrapper><aside><div><button class=btn><i>❌</i>Close</button></div><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a><nav role=navigation><details open><summary>Documentation</summary><ul><li><a href=https://learning-cloud-native-go.github.io/docs/overview/>Overview</a></li></ul></details><details open><summary>Building a Dockerized RESTful API</summary><ul><li><a class=active href=https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/>Building a Dockerized RESTful API application in Go</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/hello-world-server/>Hello World server</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/database-and-migrations/>Database and migrations</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/configurations/>Configurations</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/routes-and-openapi-specification/>Routes and OpenAPI specification</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/repository/>Repository</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/error-handling/>Error handling</a></li></ul></details></nav></aside></div><div id=content-wrapper><header><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a></header><main><article><nav><button class=btn><i>⬅️</i> On this section</button>
2+
<link rel=canonical href=https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/><link rel=stylesheet href=/assets/css/docs.min.8e9408609771a441499aa5571a4585b0ca95783b842d5c758af5eef1457b0fe0.css integrity><link rel=manifest href=/manifest.json><link rel=icon href=/favicon/favicon.ico><link rel=icon href=/favicon/favicon-16x16.png sizes=16x16 type=image/png><link rel=icon href=/favicon/favicon-32x32.png sizes=32x32 type=image/png><link rel=apple-touch-icon href=/favicon/apple-touch-icon.png sizes=180x180><script async src="https://www.googletagmanager.com/gtag/js?id=G-H3GD0XFJ42"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-H3GD0XFJ42")</script><meta property="og:title" content="Building a Dockerized RESTful API application in Go"><meta property="og:description" content="Cloud Native Go Tutorials for Everyone!"><meta property="og:type" content="article"><meta property="og:url" content="https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/"><meta property="og:image" content="https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/og.png"><meta property="og:site_name" content="Learning Cloud Native Go"><meta name=twitter:card content="summary_large_image"><meta name=twitter:title content="Building a Dockerized RESTful API application in Go"><meta name=twitter:description content="Cloud Native Go Tutorials for Everyone!"><meta name=twitter:image content="https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/og.png"><script type=application/ld+json>{"@context":"https://schema.org","@type":"Article","headline":"Building a Dockerized RESTful API application in Go","description":"Cloud Native Go Tutorials for Everyone!","image":"https:\/\/learning-cloud-native-go.github.io\/docs\/building-a-dockerized-restful-api-application-in-go\/og.png","author":{"@type":"Person","name":"map[name:Dumindu Madunuwan url:https:\/\/github.com\/dumindu]"},"publisher":{"@type":"Organization","name":"Learning Cloud Native Go","logo":{"@type":"ImageObject","url":"https:\/\/learning-cloud-native-go.github.io\/"}},"datePublished":"0001-01-01","dateModified":"2024-01-21","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/learning-cloud-native-go.github.io\/docs\/building-a-dockerized-restful-api-application-in-go\/"}}</script></head><body><div id=outer-wrapper><div id=aside-wrapper><aside><div><button class=btn><i>❌</i>Close</button></div><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a><nav role=navigation><details open><summary>Documentation</summary><ul><li><a href=https://learning-cloud-native-go.github.io/docs/overview/>Overview</a></li></ul></details><details open><summary>Building a Dockerized RESTful API</summary><ul><li><a class=active href=https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/>Building a Dockerized RESTful API application in Go</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/hello-world-server/>Hello World server</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/database-and-migrations/>Database and migrations</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/configurations/>Configurations</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/routes-and-openapi-specification/>Routes and OpenAPI specification</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/repository/>Repository</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/error-handling/>Error handling</a></li></ul></details></nav></aside></div><div id=content-wrapper><header><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a></header><main><article><nav><button class=btn><i>⬅️</i> On this section</button>
33
<button class=btn>On this page <i>➑️</i></button></nav><header><h1>Building a Dockerized RESTful API application in Go</h1><p></p></header><div id=article-body><blockquote class=info><p><strong>πŸ‘¨β€πŸ«</strong> <strong>In this series&mldr;</strong></p><p>In this series, we are going to build a Dockerized Go RESTful API for a bookshelf with these steps:</p><ul><li>Create a basic server using Go&rsquo;s <code>net/http</code> package and Dockerize it.</li><li>Add the database, SQL migration files, and create the <code>migrate</code> app to run these migration files.</li><li>Implement dynamic application configurations via environment variables.</li><li>Integrate Chi, add initial API routes, and generate OpenAPI specifications.</li><li>Integrate GORM, implement repository functions with tests, and invoke repository from the handlers.</li><li>Enhance error handling and integrate Validator v10 for form validations.</li><li>Implement error logs and request logs via Zerolog.</li></ul></blockquote><h2 id=-the-codebase>πŸ“¦ The codebase</h2><p>The completed API application supports the following API endpoints.</p><table><thead><tr><th>Name</th><th>HTTP Method</th><th>Route</th></tr></thead><tbody><tr><td>Health</td><td>GET</td><td>/livez</td></tr><tr><td>List Books</td><td>GET</td><td>/v1/books</td></tr><tr><td>Create Book</td><td>POST</td><td>/v1/books</td></tr><tr><td>Read Book</td><td>GET</td><td>/v1/books/{id}</td></tr><tr><td>Update Book</td><td>PUT</td><td>/v1/books/{id}</td></tr><tr><td>Delete Book</td><td>DELETE</td><td>/v1/books/{id}</td></tr></tbody></table><p>The sourcecode of the completed project can be found in <a href=http://github.com/learning-cloud-native-go/myapp target=_blank>learning-cloud-native-go/myapp</a> GitHub repository.</p><p>OK, Let&rsquo;s get it started!</p></div><footer><time datetime=2024-01-21><i>πŸ•’</i> Updated: 2024-01-21</time>
44
<a href=https://learning-cloud-native-go.github.io/docs/overview/><i>οΉ€</i> Previous</a>
55
<a href=https://learning-cloud-native-go.github.io/docs/hello-world-server/>Next <i>οΉ₯</i></a></footer></article><aside><div><button class=btn><i>❌</i>Close</button></div><strong>On this page</strong><nav id=TableOfContents><ul><li><a href=#-the-codebase>πŸ“¦ The codebase</a></li></ul></nav></aside></main><footer><div><i>πŸ§‘β€πŸ’»</i>Built by and copyright<a href=https://github.com/dumindu target=_blank>Dumindu Madunuwan</a><i>πŸ“…</i> 2019-2025<i>πŸš€</i> <a href=https://github.com/learning-cloud-native-go target=_blank>GitHub</a></div><div><button class=btn><i>β˜€οΈ</i><i>⁄</i><i>πŸŒ‘</i></button></div></footer></div></div><div id=body-model-outer></div><script type=text/javascript src=/assets/js/docs.min.12ffdc25c0149ef34e761ee54587f2aae17affcb8375298ad2180851930cb142.js integrity></script></body></html>
174 KB
Loading

β€Ždocs/docs/configurations/index.htmlβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!doctype html><html lang=en-US><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Cloud Native Go Tutorials for Everyone!"><meta name=author content="Dumindu Madunuwan"><meta name=theme-color content="#ffffff" media="(prefers-color-scheme: light)"><meta name=theme-color content="#101010" media="(prefers-color-scheme: dark)"><title>Configurations Β· Learning Cloud Native Go</title>
2-
<link rel=canonical href=https://learning-cloud-native-go.github.io/docs/configurations/><link rel=stylesheet href=/assets/css/docs.min.8e9408609771a441499aa5571a4585b0ca95783b842d5c758af5eef1457b0fe0.css integrity><link rel=manifest href=/manifest.json><link rel=icon href=/favicon/favicon.ico><link rel=icon href=/favicon/favicon-16x16.png sizes=16x16 type=image/png><link rel=icon href=/favicon/favicon-32x32.png sizes=32x32 type=image/png><link rel=apple-touch-icon href=/favicon/apple-touch-icon.png sizes=180x180><script async src="https://www.googletagmanager.com/gtag/js?id=G-H3GD0XFJ42"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-H3GD0XFJ42")</script></head><body><div id=outer-wrapper><div id=aside-wrapper><aside><div><button class=btn><i>❌</i>Close</button></div><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a><nav role=navigation><details open><summary>Documentation</summary><ul><li><a href=https://learning-cloud-native-go.github.io/docs/overview/>Overview</a></li></ul></details><details open><summary>Building a Dockerized RESTful API</summary><ul><li><a href=https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/>Building a Dockerized RESTful API application in Go</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/hello-world-server/>Hello World server</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/database-and-migrations/>Database and migrations</a></li><li><a class=active href=https://learning-cloud-native-go.github.io/docs/configurations/>Configurations</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/routes-and-openapi-specification/>Routes and OpenAPI specification</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/repository/>Repository</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/error-handling/>Error handling</a></li></ul></details></nav></aside></div><div id=content-wrapper><header><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a></header><main><article><nav><button class=btn><i>⬅️</i> On this section</button>
2+
<link rel=canonical href=https://learning-cloud-native-go.github.io/docs/configurations/><link rel=stylesheet href=/assets/css/docs.min.8e9408609771a441499aa5571a4585b0ca95783b842d5c758af5eef1457b0fe0.css integrity><link rel=manifest href=/manifest.json><link rel=icon href=/favicon/favicon.ico><link rel=icon href=/favicon/favicon-16x16.png sizes=16x16 type=image/png><link rel=icon href=/favicon/favicon-32x32.png sizes=32x32 type=image/png><link rel=apple-touch-icon href=/favicon/apple-touch-icon.png sizes=180x180><script async src="https://www.googletagmanager.com/gtag/js?id=G-H3GD0XFJ42"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-H3GD0XFJ42")</script><meta property="og:title" content="Configurations"><meta property="og:description" content="Cloud Native Go Tutorials for Everyone!"><meta property="og:type" content="article"><meta property="og:url" content="https://learning-cloud-native-go.github.io/docs/configurations/"><meta property="og:image" content="https://learning-cloud-native-go.github.io/docs/configurations/og.png"><meta property="og:site_name" content="Learning Cloud Native Go"><meta name=twitter:card content="summary_large_image"><meta name=twitter:title content="Configurations"><meta name=twitter:description content="Cloud Native Go Tutorials for Everyone!"><meta name=twitter:image content="https://learning-cloud-native-go.github.io/docs/configurations/og.png"><script type=application/ld+json>{"@context":"https://schema.org","@type":"Article","headline":"Configurations","description":"Cloud Native Go Tutorials for Everyone!","image":"https:\/\/learning-cloud-native-go.github.io\/docs\/configurations\/og.png","author":{"@type":"Person","name":"map[name:Dumindu Madunuwan url:https:\/\/github.com\/dumindu]"},"publisher":{"@type":"Organization","name":"Learning Cloud Native Go","logo":{"@type":"ImageObject","url":"https:\/\/learning-cloud-native-go.github.io\/"}},"datePublished":"0001-01-01","dateModified":"2025-06-29","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/learning-cloud-native-go.github.io\/docs\/configurations\/"}}</script></head><body><div id=outer-wrapper><div id=aside-wrapper><aside><div><button class=btn><i>❌</i>Close</button></div><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a><nav role=navigation><details open><summary>Documentation</summary><ul><li><a href=https://learning-cloud-native-go.github.io/docs/overview/>Overview</a></li></ul></details><details open><summary>Building a Dockerized RESTful API</summary><ul><li><a href=https://learning-cloud-native-go.github.io/docs/building-a-dockerized-restful-api-application-in-go/>Building a Dockerized RESTful API application in Go</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/hello-world-server/>Hello World server</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/database-and-migrations/>Database and migrations</a></li><li><a class=active href=https://learning-cloud-native-go.github.io/docs/configurations/>Configurations</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/routes-and-openapi-specification/>Routes and OpenAPI specification</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/repository/>Repository</a></li><li><a href=https://learning-cloud-native-go.github.io/docs/error-handling/>Error handling</a></li></ul></details></nav></aside></div><div id=content-wrapper><header><a href=https://learning-cloud-native-go.github.io/ class=site-logo>Learning Cloud Native Go</a></header><main><article><nav><button class=btn><i>⬅️</i> On this section</button>
33
<button class=btn>On this page <i>➑️</i></button></nav><header><h1>Configurations</h1><p></p></header><div id=article-body><blockquote class=info><p><strong>πŸ‘¨β€πŸ«</strong> <strong>Before we start&mldr;</strong></p><ul><li>Configurations can be stored in a variety of formats, such as <code>.xml</code>, <code>.json</code>, <code>.env</code>, <code>.yaml</code>, and <code>.toml</code> files, as well as systems like <a href=https://etcd.io/ target=_blank><code>etcd</code></a>, <a href=https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html target=_blank>AWS Parameter Store</a>, and <a href=https://cloud.google.com/deployment-manager/runtime-configurator/ target=_blank>GCP Runtime Configurator</a>. In this project, we will save the configurations in an <code>.env</code> file and use <code>docker-compose</code> to load them into the development environment.</li><li>Go standard library provides the <a href=https://golang.org/pkg/os/#Getenv target=_blank><code>os.Getenv()</code></a> function to read each environment variable separately. But there are Go libraries such as <a href=https://github.com/spf13/viper target=_blank><code>spf13/viper</code></a>, <a href=https://github.com/kelseyhightower/envconfig target=_blank><code>kelseyhightower/envconfig</code></a>, <a href=https://github.com/caarlos0/env target=_blank><code>caarlos0/env</code></a>, and <a href=https://github.com/joeshaw/envdecode target=_blank><code>joeshaw/envdecode</code></a> to read environment variables in bulk and populate them as a struct. We choose <a href=https://github.com/joeshaw/envdecode target=_blank><code>joeshaw/envdecode</code></a> for this project because it includes validations, zero-dependency, and ease of use.</li></ul></blockquote><h2 id=populate-environment-variables-with-docker>Populate environment variables with Docker</h2><p>πŸ’‘ We use <code>docker compose</code> with the <a href=https://docs.docker.com/compose/compose-file/compose-file-v3/#env_file target=_blank><code>env_file</code></a> option to load the environment variables into the development environment. If you are using <code>docker run</code>, you can use the <a href=https://docs.docker.com/engine/reference/commandline/run/#options target=_blank><code>--env-file</code> option</a> with it.</p><h3 id=1-add-env>1. Add <code>.env</code></h3><div class=highlight><pre tabindex=0 class=chroma><code class=language-env data-lang=env><span class=line><span class=cl><span class=nv>SERVER_PORT</span><span class=o>=</span><span class=m>8080</span>
44
</span></span><span class=line><span class=cl><span class=nv>SERVER_TIMEOUT_READ</span><span class=o>=</span>3s
55
</span></span><span class=line><span class=cl><span class=nv>SERVER_TIMEOUT_WRITE</span><span class=o>=</span>5s
150 KB
Loading

0 commit comments

Comments
Β (0)