{"id":16622,"date":"2017-03-16T12:15:44","date_gmt":"2017-03-16T10:15:44","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=16622"},"modified":"2017-03-15T13:15:28","modified_gmt":"2017-03-15T11:15:28","slug":"docker-secrets-management","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/","title":{"rendered":"Docker Secrets Management"},"content":{"rendered":"<p>I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and potentially rendered your services to unrequited access. With the ever-growing amount of services we depend on for our development stack, the number of sensitive details to remember and track has also increased. To cope with this problem, tools have emerged in the field of \u201csecrets management.\u201d In this post, I am going to look at Docker Secrets, the new secrets management feature available in Docker 1.13 and higher.<\/p>\n<p>The feature doesn\u2019t require much work on your part from a Docker perceptive, but you may need to refactor your applications to take advantage of it. I will present ideas on how to do this, but not exhaustively.<\/p>\n<h2>Swarm Only<\/h2>\n<p>Docker Secrets only work across Docker swarms, mostly because that\u2019s the area where secrets management makes the most sense. After all, Swarm is aimed at production usage where multiple Docker instances need to share access details between themselves. If you want to use secrets management in a standalone container, you need to run a container with a <code>scale<\/code> value set to \u20181\u2019. Docker for Mac and Windows doesn\u2019t support multinode swarm mode, but you can use them to create a multinode swarm with Docker Machine.<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/machine\/get-started\/#create-a-machine\">Create two machines<\/a> and then <a href=\"https:\/\/docs.docker.com\/engine\/swarm\/swarm-tutorial\/create-swarm\/\">a swarm of two nodes<\/a>, and run the rest of the commands in this article from a manager in that swarm.<\/p>\n<h2>Getting Secrets<\/h2>\n<p>As you create secrets from the command line, you have the whole gamut of tools available to you to for creating random passwords and piping output. For example, to create a random password for a database user:<\/p>\n<pre class=\"brush:php\">openssl rand -base64 20 | docker secret create mariadb_password -<\/pre>\n<p>This will return an ID for the secret.<\/p>\n<p>You need to issue this command a second time to generate a password for the <a href=\"https:\/\/mariadb.org\/\">MariaDB<\/a> root user. You will need this to get started, but you won\u2019t need this for every service.<\/p>\n<pre class=\"brush:php\">openssl rand -base64 20 | docker secret create mariadb_root_password -<\/pre>\n<p>If you\u2019re already forgetting the secrets you\u2019ve created, then the time-honored <code>ls<\/code> command also works here:<\/p>\n<pre class=\"brush:php\">docker secret ls<\/pre>\n<h2>Exchanging Secrets<\/h2>\n<p>To keep the secrets, well, secret, communication between the services happens in an overlay network that you define. They\u2019re only available in that overlay network by calling their ID.<\/p>\n<pre class=\"brush:php\">docker network create -d overlay mariadb_private<\/pre>\n<p>This will also return an ID for that network. Again you can use <code>docker network ls<\/code> to remind yourself of what\u2019s available.<\/p>\n<h2>Create Service(s)<\/h2>\n<p>This example will have a Docker node running MariaDB, and a node running Python. In a final application, the Python application would read and write to the database.<\/p>\n<p>First, add a MariaDB service. This service uses the network you created to communicate, and the secrets created earlier are saved into two files: one for the root password and one for a default user password. Then pass all the variables you need to the service as environment variables.<\/p>\n<pre class=\"brush:php\">docker service create \\\r\n   --name mariadb \\\r\n   --replicas 1 \\\r\n   --network mariadb_private \\\r\n   --mount type=volume,source=mydata,destination=\/var\/lib\/mariadb \\\r\n   --secret source=mariadb_root_password,target=mariadb_root_password \\\r\n   --secret source=mariadb_password,target=mariadb_password \\\r\n   -e MARIADB_ROOT_PASSWORD_FILE=\"\/run\/secrets\/mariadb_root_password\" \\\r\n   -e MARIADB_PASSWORD_FILE=\"\/run\/secrets\/mariadb_password\" \\\r\n   -e MARIADB_USER=\"python\" \\\r\n   -e MARIADB_DATABASE=\"python\" \\\r\n   mariadb:latest<\/pre>\n<p>The Python instance again uses the private network you created and copies the secrets accessible in the network. A better (production-ready) option would be to create the databases your application needs in an admin program and never give the application access to root passwords, but this is purely for an example.<\/p>\n<pre class=\"brush:php\">docker service create \\\r\n   --name cspython \\\r\n   --replicas 1 \\\r\n   --network mariadb_private \\\r\n   --publish 50000:5000 \\\r\n   --mount type=volume,source=pydata,destination=\/var\/www\/html \\\r\n   --secret source=mariadb_root_password,target=python_root_password,mode=0400 \\\r\n   --secret source=mariadb_password,target=python_password,mode=0400 \\\r\n   -e PYTHON_DB_USER=\"python\" \\\r\n   -e PYTHON_DB_ROOT_PASSWORD_FILE=\"\/run\/secrets\/python_root_password\" \\\r\n   -e PYTHON_DB_PASSWORD_FILE=\"\/run\/secrets\/python_password\" \\\r\n   -e PYTHON_DB_HOST=\"mariadb:3306\" \\\r\n   -e PYTHON_DB_NAME=\"python\" \\\r\n   chrischinchilla\/cspython:latest<\/pre>\n<p>The example above uses a simple Docker image I created that sets up packages for creating a web application using <a href=\"http:\/\/flask.pocoo.org\/\">Flask<\/a> for serving web pages and <a href=\"https:\/\/github.com\/PyMySQL\/PyMySQL\">PyMySQL<\/a> for database access. The code doesn\u2019t do much but shows how you could access the environment variables from the Docker container.<\/p>\n<p>For example, to connect to the database server with no database specified:<\/p>\n<pre class=\"brush:sql\">import os\r\nimport MySQLdb\r\n\r\ndb = MySQLdb.connect(host=os.environ['PYTHON_DB_HOST'],\r\nuser=os.environ['PYTHON_DB_ROOT_USER'],\r\npasswd=os.environ['PYTHON_DB_PASSWORD_FILE'])\r\n\r\ncur = db.cursor()\r\n\r\nprint(db)\r\n\r\ndb.close()<\/pre>\n<h2>Rotating Secrets<\/h2>\n<p>It\u2019s good practice to frequently change sensitive information. However, as you likely know, updating those details in applications is a dull process most would rather avoid. Via Services, Docker Secrets management allows you to change the values without having to change your code.<\/p>\n<p>Create a new secret:<\/p>\n<pre class=\"brush:php\">openssl rand -base64 20 | docker secret create mariadb_password_march -<\/pre>\n<p>Remove the access to the current secret from the MariaDB service:<\/p>\n<pre class=\"brush:php\">docker service update \\\r\n     --secret-rm mariadb_password \\\r\n     mariadb<\/pre>\n<p>And give it access to the new secret, pointing the target to the new value:<\/p>\n<pre class=\"brush:php\">docker service update \\\r\n     --secret-add source=mariadb_password_march,target=mysql_password \\\r\n     mariadb<\/pre>\n<p>Update the Python service:<\/p>\n<pre class=\"brush:php\">docker service update \\\r\n     --secret-rm mariadb_password \\\r\n     --secret-add source=mariadb_password_march,target=python_password,mode=0400 \\\r\n     cspython<\/pre>\n<p>And remove the old secret:<\/p>\n<pre class=\"brush:php\">docker secret rm mariadb_password<\/pre>\n<h2>Spread the Word<\/h2>\n<p>Docker Secrets is a new feature, but Docker encourages image maintainers to add support for it as soon as possible for better security among Docker users. This entails allowing for a similar process to the example above, where a container can read every parameter it needs from a file(s) created by generating a secret instead of hard-coded into an application. This enforces the idea of containerized applications as containers can come and go, but always have access to the important information you need for your application to run.<\/p>\n<p>For more details on the <code>secret<\/code> command (there\u2019s not much!), read the reference guide <a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/secret\/\">here<\/a>.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/blog.codeship.com\/docker-secrets-management\/\">Docker Secrets Management<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/join-us\/wcg\/\">WCG partner<\/a>\u00a0Chris Ward at the <a href=\"http:\/\/blog.codeship.com\/\">Codeship Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and potentially rendered your services to unrequited access. With the ever-growing amount of services we depend on for our development stack, the number of sensitive details to remember and track has &hellip;<\/p>\n","protected":false},"author":148,"featured_media":10356,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[217],"class_list":["post-16622","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker Secrets Management - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Secrets Management - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-16T10:15:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Chris Ward\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chris Ward\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\"},\"author\":{\"name\":\"Chris Ward\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757\"},\"headline\":\"Docker Secrets Management\",\"datePublished\":\"2017-03-16T10:15:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\"},\"wordCount\":798,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"keywords\":[\"Docker\"],\"articleSection\":[\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\",\"name\":\"Docker Secrets Management - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"datePublished\":\"2017-03-16T10:15:44+00:00\",\"description\":\"I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/devops\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Docker Secrets Management\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757\",\"name\":\"Chris Ward\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g\",\"caption\":\"Chris Ward\"},\"description\":\"Chris Ward is a technical writer, speaker, and developer.\",\"url\":\"https:\/\/www.webcodegeeks.com\/author\/chris-ward\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker Secrets Management - Web Code Geeks - 2026","description":"I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and","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:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/","og_locale":"en_US","og_type":"article","og_title":"Docker Secrets Management - Web Code Geeks - 2026","og_description":"I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and","og_url":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2017-03-16T10:15:44+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","type":"image\/jpeg"}],"author":"Chris Ward","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Chris Ward","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/"},"author":{"name":"Chris Ward","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757"},"headline":"Docker Secrets Management","datePublished":"2017-03-16T10:15:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/"},"wordCount":798,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","keywords":["Docker"],"articleSection":["DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/","url":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/","name":"Docker Secrets Management - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","datePublished":"2017-03-16T10:15:44+00:00","description":"I\u2019m sure we\u2019ve all been there. That moment when you realize that important and sensitive access details have leaked online into a public space and","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-secrets-management\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.webcodegeeks.com\/category\/devops\/"},{"@type":"ListItem","position":3,"name":"Docker Secrets Management"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/ec768d779e3ecb955c5f552f0f734757","name":"Chris Ward","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e715e4a95de958fcd3da75cde89b6459b80f977d665284e37751ecdcb2b1e4c4?s=96&d=mm&r=g","caption":"Chris Ward"},"description":"Chris Ward is a technical writer, speaker, and developer.","url":"https:\/\/www.webcodegeeks.com\/author\/chris-ward\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/16622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/148"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=16622"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/16622\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/10356"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=16622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=16622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=16622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}