{"id":17654949,"url":"https://github.com/aabouzaid/docker-best-practices-workshop","last_synced_at":"2026-02-11T14:03:14.408Z","repository":{"id":80895625,"uuid":"408816332","full_name":"aabouzaid/docker-best-practices-workshop","owner":"aabouzaid","description":"Docker Best Practices Workshop hands-on","archived":false,"fork":false,"pushed_at":"2023-09-09T22:32:15.000Z","size":1717,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-07T23:39:06.394Z","etag":null,"topics":["best-practices","docker","workshop"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aabouzaid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-09-21T12:44:24.000Z","updated_at":"2025-02-25T18:55:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"cdf3ed0c-4345-4715-9879-07c5a3b42921","html_url":"https://github.com/aabouzaid/docker-best-practices-workshop","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aabouzaid/docker-best-practices-workshop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aabouzaid%2Fdocker-best-practices-workshop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aabouzaid%2Fdocker-best-practices-workshop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aabouzaid%2Fdocker-best-practices-workshop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aabouzaid%2Fdocker-best-practices-workshop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aabouzaid","download_url":"https://codeload.github.com/aabouzaid/docker-best-practices-workshop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aabouzaid%2Fdocker-best-practices-workshop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29333919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T12:42:24.625Z","status":"ssl_error","status_checked_at":"2026-02-11T12:41:23.344Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["best-practices","docker","workshop"],"created_at":"2024-10-23T12:40:23.743Z","updated_at":"2026-02-11T14:03:14.402Z","avatar_url":"https://github.com/aabouzaid.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Docker Best Practices Workshop\n\nIn a hands-on approach, we will cover 18 best practices in 4 categories or in other words **✅️ Dos \u0026 🚫 Don'ts**.\n\nPlease note, this workshop assumes that you have a basic knowledge of Docker.\n\nFor the slides and recording: [Docker Best Practices Workshop](https://tech.aabouzaid.com/2021/09/docker-best-practices-workshop-presentation.html).\n\n\n## The Application\n\nThe application source code is copied from [Docker Sample Application](https://docs.docker.com/get-started/02_our_app/)\n\nIt's a simple todo list manager that is running in Node.js, however, no real JavaScript experience is needed.\nWe will just run it.\n\n\n## The Goal\n\nReview the application [Dockerfile](./app/Dockerfile) and update it with the best practices\naccording to what we have in the first part of the workshop.\n\nBuild:\n```\ndocker build . -t docker-sample-app:v1\n```\n\nRun:\n```\ndocker run -p 3000:3000 docker-sample-app:v1\n```\n\nView:\n\nhttp://localhost:3000\n\n\n## Cheat Sheet\n\n### Essential Practices\n- Use Dockerfile linter\n- Check Docker language specific best practices\n- Create a single application per Docker image\n- Create configurable ephemeral containers\n\n### Image Practices\n- Use optimal base image\n- Pin versions everywhere\n- Create image with the optimal size\n- Use multi-stage whenever possible\n- Avoid any unnecessary files\n\n### Security Practices\n- Always use trusted images\n- Never use untrusted resources\n- Never store sensitive data in the image\n- Use a non-root user\n- Scan image vulnerabilities\n\n### Misc Practices\n- Leverage Docker build cache\n- Avoid system cache\n- Create a unified image across envs\n- Use ENTRYPOINT with CMD\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faabouzaid%2Fdocker-best-practices-workshop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faabouzaid%2Fdocker-best-practices-workshop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faabouzaid%2Fdocker-best-practices-workshop/lists"}