dockerls 1.0.0__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. {dockerls-1.0.0 → dockerls-1.0.2}/PKG-INFO +50 -1
  2. {dockerls-1.0.0 → dockerls-1.0.2}/README.md +49 -0
  3. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/PKG-INFO +50 -1
  4. {dockerls-1.0.0 → dockerls-1.0.2}/pyproject.toml +1 -1
  5. {dockerls-1.0.0 → dockerls-1.0.2}/LICENSE +0 -0
  6. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/__init__.py +0 -0
  7. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/__init__.py +0 -0
  8. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/dto/__init__.py +0 -0
  9. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/dto/analysis.py +0 -0
  10. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/__init__.py +0 -0
  11. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/alternatives_lookup.py +0 -0
  12. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/composite_repository.py +0 -0
  13. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/cross_validation.py +0 -0
  14. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/ecosystems.py +0 -0
  15. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/fallback_scanner.py +0 -0
  16. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/hardening_analysis.py +0 -0
  17. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/migration.py +0 -0
  18. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/progress.py +0 -0
  19. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/remediation.py +0 -0
  20. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/scan_history_store.py +0 -0
  21. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/scanner_factory.py +0 -0
  22. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/source_registry.py +0 -0
  23. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/tag_history_store.py +0 -0
  24. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/teardown.py +0 -0
  25. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/verdict.py +0 -0
  26. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/version_discovery.py +0 -0
  27. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/__init__.py +0 -0
  28. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/analyze_dockerfile.py +0 -0
  29. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/analyze_image.py +0 -0
  30. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/build_image.py +0 -0
  31. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/compare_images.py +0 -0
  32. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/fleet_scan.py +0 -0
  33. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/recommend_images.py +0 -0
  34. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/registry_audit.py +0 -0
  35. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/search_images.py +0 -0
  36. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/upgrade_base.py +0 -0
  37. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cache/__init__.py +0 -0
  38. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cache/sqlite_cache.py +0 -0
  39. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/__init__.py +0 -0
  40. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/analysis_baseline.py +0 -0
  41. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/app.py +0 -0
  42. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/__init__.py +0 -0
  43. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/advisor.py +0 -0
  44. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/alternatives.py +0 -0
  45. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/analyze.py +0 -0
  46. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/analyze_dockerfile.py +0 -0
  47. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/base_cmd.py +0 -0
  48. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/base_image.py +0 -0
  49. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/build.py +0 -0
  50. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/cache_cmd.py +0 -0
  51. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/compare.py +0 -0
  52. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/controls.py +0 -0
  53. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/doctor.py +0 -0
  54. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/export.py +0 -0
  55. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/fleet.py +0 -0
  56. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/health.py +0 -0
  57. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/login.py +0 -0
  58. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/policy_cmd.py +0 -0
  59. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/provenance_cmd.py +0 -0
  60. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/recommend.py +0 -0
  61. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/registry_audit_cmd.py +0 -0
  62. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/sbom.py +0 -0
  63. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/search.py +0 -0
  64. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/verify.py +0 -0
  65. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/version.py +0 -0
  66. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/vex_cmd.py +0 -0
  67. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/dependencies.py +0 -0
  68. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/image_names.py +0 -0
  69. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/options.py +0 -0
  70. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/progress.py +0 -0
  71. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/publish_prompt.py +0 -0
  72. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/rendering.py +0 -0
  73. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/runtime.py +0 -0
  74. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/scan_failure.py +0 -0
  75. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/text.py +0 -0
  76. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/validators.py +0 -0
  77. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/vulnerability_view.py +0 -0
  78. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/__init__.py +0 -0
  79. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/__init__.py +0 -0
  80. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/declared_metadata.py +0 -0
  81. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/dockerfile_analysis.py +0 -0
  82. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/image.py +0 -0
  83. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/image_facts.py +0 -0
  84. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/recommendation.py +0 -0
  85. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/scan_result.py +0 -0
  86. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/vulnerability.py +0 -0
  87. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/__init__.py +0 -0
  88. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/cache_store.py +0 -0
  89. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/dockerfile_validator.py +0 -0
  90. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/eol_checker.py +0 -0
  91. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/image_repository.py +0 -0
  92. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/scanner.py +0 -0
  93. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/security_controls.py +0 -0
  94. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/__init__.py +0 -0
  95. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/attack_surface.py +0 -0
  96. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/base_recipe.py +0 -0
  97. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/base_upgrade.py +0 -0
  98. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/build_labels.py +0 -0
  99. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/build_policy.py +0 -0
  100. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/confidence.py +0 -0
  101. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/fleet.py +0 -0
  102. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/gate.py +0 -0
  103. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/hardening.py +0 -0
  104. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/image_reference.py +0 -0
  105. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/inheritance.py +0 -0
  106. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/network_policy.py +0 -0
  107. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/production_readiness.py +0 -0
  108. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/provenance.py +0 -0
  109. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/recipe_diff.py +0 -0
  110. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/registry_audit.py +0 -0
  111. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/registry_target.py +0 -0
  112. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/remediation_score.py +0 -0
  113. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/scan_history.py +0 -0
  114. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/scan_plan.py +0 -0
  115. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/scanner_db.py +0 -0
  116. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/security_score.py +0 -0
  117. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/security_tier.py +0 -0
  118. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/tag_history.py +0 -0
  119. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/tool_release.py +0 -0
  120. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/tristate.py +0 -0
  121. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/vex.py +0 -0
  122. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exit_codes.py +0 -0
  123. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/__init__.py +0 -0
  124. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/base.py +0 -0
  125. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/csv_exporter.py +0 -0
  126. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/factory.py +0 -0
  127. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/html_exporter.py +0 -0
  128. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/json_exporter.py +0 -0
  129. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/markdown_exporter.py +0 -0
  130. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/sarif_exporter.py +0 -0
  131. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/__init__.py +0 -0
  132. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/config/__init__.py +0 -0
  133. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/config/policy_file.py +0 -0
  134. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/config/settings.py +0 -0
  135. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/database/__init__.py +0 -0
  136. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/database/models.py +0 -0
  137. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/dockerfile_validator.py +0 -0
  138. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/evidence.py +0 -0
  139. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/hashing.py +0 -0
  140. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/logging/__init__.py +0 -0
  141. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/logging/setup.py +0 -0
  142. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/network/__init__.py +0 -0
  143. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/network/guarded_client.py +0 -0
  144. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/network/host_guard.py +0 -0
  145. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/redaction.py +0 -0
  146. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/alpine.dockerfile +0 -0
  147. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/debian.dockerfile +0 -0
  148. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/distroless.dockerfile +0 -0
  149. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-alpine.dockerfile +0 -0
  150. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-debian.dockerfile +0 -0
  151. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-distroless.dockerfile +0 -0
  152. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-scratch.dockerfile +0 -0
  153. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go.dockerfile +0 -0
  154. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/gradle-alpine.dockerfile +0 -0
  155. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/gradle.dockerfile +0 -0
  156. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-alpine.dockerfile +0 -0
  157. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-debian.dockerfile +0 -0
  158. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-distroless.dockerfile +0 -0
  159. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-ubuntu.dockerfile +0 -0
  160. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java.dockerfile +0 -0
  161. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/maven-alpine.dockerfile +0 -0
  162. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/maven.dockerfile +0 -0
  163. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-alpine.dockerfile +0 -0
  164. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-debian.dockerfile +0 -0
  165. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-distroless.dockerfile +0 -0
  166. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-ubuntu.dockerfile +0 -0
  167. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node.dockerfile +0 -0
  168. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php-alpine.dockerfile +0 -0
  169. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php-debian.dockerfile +0 -0
  170. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php-ubuntu.dockerfile +0 -0
  171. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php.dockerfile +0 -0
  172. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-alpine.dockerfile +0 -0
  173. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-debian.dockerfile +0 -0
  174. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-distroless.dockerfile +0 -0
  175. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-ubuntu.dockerfile +0 -0
  176. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python.dockerfile +0 -0
  177. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/ruby-alpine.dockerfile +0 -0
  178. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/ruby-debian.dockerfile +0 -0
  179. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust-alpine.dockerfile +0 -0
  180. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust-debian.dockerfile +0 -0
  181. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust-scratch.dockerfile +0 -0
  182. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust.dockerfile +0 -0
  183. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/ubuntu.dockerfile +0 -0
  184. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/toolchain/__init__.py +0 -0
  185. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/toolchain/db_metadata.py +0 -0
  186. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/toolchain/installer.py +0 -0
  187. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/__init__.py +0 -0
  188. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/__init__.py +0 -0
  189. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/catalog.py +0 -0
  190. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/definition.py +0 -0
  191. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/repository.py +0 -0
  192. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dockerhub/__init__.py +0 -0
  193. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dockerhub/client.py +0 -0
  194. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dockerhub/urls.py +0 -0
  195. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/endoflife/__init__.py +0 -0
  196. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/endoflife/checker.py +0 -0
  197. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/__init__.py +0 -0
  198. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/batch.py +0 -0
  199. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/client.py +0 -0
  200. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/locator.py +0 -0
  201. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/exploitdb/__init__.py +0 -0
  202. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/exploitdb/client.py +0 -0
  203. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/grype/__init__.py +0 -0
  204. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/grype/scanner.py +0 -0
  205. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/__init__.py +0 -0
  206. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/hardened.py +0 -0
  207. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/inspector.py +0 -0
  208. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/oci.py +0 -0
  209. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/private.py +0 -0
  210. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/urls.py +0 -0
  211. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/scan_errors.py +0 -0
  212. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/scan_target.py +0 -0
  213. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/signing/__init__.py +0 -0
  214. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/signing/cosign.py +0 -0
  215. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/threat_intel/__init__.py +0 -0
  216. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/threat_intel/client.py +0 -0
  217. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/trivy/__init__.py +0 -0
  218. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/trivy/cache_pool.py +0 -0
  219. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/trivy/scanner.py +0 -0
  220. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/__init__.py +0 -0
  221. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/auth.py +0 -0
  222. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/executables.py +0 -0
  223. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/ignore_file.py +0 -0
  224. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/rate_limit.py +0 -0
  225. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/resources.py +0 -0
  226. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/retry.py +0 -0
  227. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/safe_yaml.py +0 -0
  228. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/subprocess_runner.py +0 -0
  229. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/validation.py +0 -0
  230. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/SOURCES.txt +0 -0
  231. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/dependency_links.txt +0 -0
  232. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/entry_points.txt +0 -0
  233. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/requires.txt +0 -0
  234. {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/top_level.txt +0 -0
  235. {dockerls-1.0.0 → dockerls-1.0.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dockerls
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Enterprise Docker Image Security Advisor
5
5
  Author: Ivomsantiago
6
6
  License: MIT
@@ -253,6 +253,11 @@ preciso". `base-image` faz essa escolha acontecer antes de qualquer coisa
253
253
  existir: sem `--with`, ele mostra um menu com o custo de cada pacote em
254
254
  superfície de ataque, não só o que ele serve.
255
255
 
256
+ ![menu de pacotes do base-image](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_image_menu.svg)
257
+
258
+ <details>
259
+ <summary>Ver como texto (copiar/colar)</summary>
260
+
256
261
  ```console
257
262
  $ dockerls base-image --os alpine --runtime node
258
263
 
@@ -288,6 +293,8 @@ processes
288
293
  Comma-separated numbers (empty = no packages): 1,2,9
289
294
  ```
290
295
 
296
+ </details>
297
+
291
298
  Repare no `curl`: o propósito ("HEALTHCHECK e diagnóstico de rede") é
292
299
  legítimo, mas o custo dito ali do lado é o mesmo que um atacante usa pra
293
300
  buscar o segundo estágio de um ataque. O menu não esconde isso pra depois —
@@ -296,6 +303,11 @@ mostra na hora de marcar.
296
303
  Em pipeline não tem menu pra responder. `--with` aceita a mesma lista
297
304
  separada por vírgula e pula direto pro Dockerfile:
298
305
 
306
+ ![base-image com --with, gerando o Dockerfile](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_image_with.svg)
307
+
308
+ <details>
309
+ <summary>Ver como texto (copiar/colar)</summary>
310
+
299
311
  ```console
300
312
  $ dockerls base-image --os alpine --runtime node \
301
313
  --with "ca-certificates,tzdata,tini" -o Dockerfile \
@@ -311,6 +323,8 @@ Next step
311
323
  until then it is only an intention.
312
324
  ```
313
325
 
326
+ </details>
327
+
314
328
  Existem três pacotes que esse catálogo se recusa a oferecer, mesmo por
315
329
  `--with` — são recusas documentadas, não omissões:
316
330
 
@@ -330,6 +344,11 @@ travada no catálogo (`RUNTIME_BASES`, em
330
344
  pra cada um. Se você precisa de outra versão, o caminho é editar a linha
331
345
  `FROM` manualmente e resolver o digest de novo:
332
346
 
347
+ ![dockerls base . repinando o digest](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_pin_digest.svg)
348
+
349
+ <details>
350
+ <summary>Ver como texto (copiar/colar)</summary>
351
+
333
352
  ```console
334
353
  $ sed -i 's/FROM node:22-alpine@\${BASE_DIGEST}/FROM node:20-alpine/; s/ARG BASE_DIGEST=.*/ARG BASE_DIGEST=/' Dockerfile
335
354
  $ dockerls base .
@@ -351,6 +370,8 @@ Rebuild and scan before publishing: changing the base digest changes the image,
351
370
  and only a scan tells you whether for the better.
352
371
  ```
353
372
 
373
+ </details>
374
+
354
375
  `base` não sabe (nem tenta adivinhar) se a troca de versão é segura — ele só
355
376
  garante que, seja qual for a tag, ela fica pinada por digest antes de ir pra
356
377
  frente. A resposta sobre segurança vem do scan, no passo 5.
@@ -366,6 +387,11 @@ do PowerShell inteiro a partir dali.
366
387
 
367
388
  ### 4. Validar antes de construir
368
389
 
390
+ ![resultado do analyze-dockerfile](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/analyze_dockerfile.svg)
391
+
392
+ <details>
393
+ <summary>Ver como texto (copiar/colar)</summary>
394
+
369
395
  ```console
370
396
  $ dockerls analyze-dockerfile .
371
397
 
@@ -393,6 +419,8 @@ Summary: 9 passed | 4 warnings | 0 errors
393
419
  Security Score: 90/100 Tier: A Production Ready: Yes
394
420
  ```
395
421
 
422
+ </details>
423
+
396
424
  Isso roda sem Docker, sem scanner, sem rede — é análise estática do texto do
397
425
  Dockerfile. Os warnings aqui (sem multi-stage, sem HEALTHCHECK, sem
398
426
  `.dockerignore`) são exatamente o que aparece de novo como sugestão depois do
@@ -408,6 +436,11 @@ findings (base vs. suas camadas). `--fail-on critical,kev` soma mais um
408
436
  critério: falhar também se algum CVE encontrado está no catálogo CISA KEV —
409
437
  sendo explorado ativamente, mesmo que não seja CRITICAL.
410
438
 
439
+ ![dockerls build --production com o gate de segurança](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/build_production.svg)
440
+
441
+ <details>
442
+ <summary>Ver como texto (copiar/colar)</summary>
443
+
411
444
  ```console
412
445
  $ dockerls build . -t minhaapp:1.0 --production --fail-on critical,kev `
413
446
  --owner "team-x" `
@@ -455,6 +488,8 @@ OUTPUT (measured after the build)
455
488
  Image sha256:5e5a079bbd616d166b155f15dac48c9c603a9d605876c732fde620a7aa7958bc
456
489
  ```
457
490
 
491
+ </details>
492
+
458
493
  Sem `--owner`, `--source` e `--security-contact`, esse mesmo comando falha —
459
494
  de propósito: `required_labels` é parte do perfil `--production`, e o motivo
460
495
  está no próprio erro quando isso acontece: "sem isso ninguém sabe pra quem
@@ -462,17 +497,29 @@ ligar quando essa imagem aparecer num alerta às três da manhã".
462
497
 
463
498
  ### 6. Usando a imagem depois de construída
464
499
 
500
+ ![docker run --rm minhaapp:1.0 id](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/docker_run_id.svg)
501
+
502
+ <details>
503
+ <summary>Ver como texto (copiar/colar)</summary>
504
+
465
505
  ```console
466
506
  $ docker run --rm minhaapp:1.0 id
467
507
  uid=1000(node) gid=1000(node) groups=1000(node),1000(node)
468
508
  ```
469
509
 
510
+ </details>
511
+
470
512
  `uid=1000`, não `uid=0`. É o `USER node` do Dockerfile confirmado em
471
513
  execução, não só lido no texto — a mesma checagem que `non_root_user` faz de
472
514
  forma estática no passo 4, agora contra o container de verdade.
473
515
 
474
516
  ### 7. Fechando o loop
475
517
 
518
+ ![dockerls analyze minhaapp:1.0 (imagem já construída)](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/analyze_final.svg)
519
+
520
+ <details>
521
+ <summary>Ver como texto (copiar/colar)</summary>
522
+
476
523
  ```console
477
524
  $ dockerls analyze minhaapp:1.0
478
525
 
@@ -492,6 +539,8 @@ Analysis: minhaapp:1.0
492
539
  Scanner trivy
493
540
  ```
494
541
 
542
+ </details>
543
+
495
544
  O mesmo `analyze` que você rodaria contra `node:22-alpine` pra decidir se
496
545
  confia nela funciona igual contra o que você acabou de construir. Não existe
497
546
  um comando separado pra "auditar a própria imagem" — é o mesmo raio-x, na
@@ -202,6 +202,11 @@ preciso". `base-image` faz essa escolha acontecer antes de qualquer coisa
202
202
  existir: sem `--with`, ele mostra um menu com o custo de cada pacote em
203
203
  superfície de ataque, não só o que ele serve.
204
204
 
205
+ ![menu de pacotes do base-image](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_image_menu.svg)
206
+
207
+ <details>
208
+ <summary>Ver como texto (copiar/colar)</summary>
209
+
205
210
  ```console
206
211
  $ dockerls base-image --os alpine --runtime node
207
212
 
@@ -237,6 +242,8 @@ processes
237
242
  Comma-separated numbers (empty = no packages): 1,2,9
238
243
  ```
239
244
 
245
+ </details>
246
+
240
247
  Repare no `curl`: o propósito ("HEALTHCHECK e diagnóstico de rede") é
241
248
  legítimo, mas o custo dito ali do lado é o mesmo que um atacante usa pra
242
249
  buscar o segundo estágio de um ataque. O menu não esconde isso pra depois —
@@ -245,6 +252,11 @@ mostra na hora de marcar.
245
252
  Em pipeline não tem menu pra responder. `--with` aceita a mesma lista
246
253
  separada por vírgula e pula direto pro Dockerfile:
247
254
 
255
+ ![base-image com --with, gerando o Dockerfile](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_image_with.svg)
256
+
257
+ <details>
258
+ <summary>Ver como texto (copiar/colar)</summary>
259
+
248
260
  ```console
249
261
  $ dockerls base-image --os alpine --runtime node \
250
262
  --with "ca-certificates,tzdata,tini" -o Dockerfile \
@@ -260,6 +272,8 @@ Next step
260
272
  until then it is only an intention.
261
273
  ```
262
274
 
275
+ </details>
276
+
263
277
  Existem três pacotes que esse catálogo se recusa a oferecer, mesmo por
264
278
  `--with` — são recusas documentadas, não omissões:
265
279
 
@@ -279,6 +293,11 @@ travada no catálogo (`RUNTIME_BASES`, em
279
293
  pra cada um. Se você precisa de outra versão, o caminho é editar a linha
280
294
  `FROM` manualmente e resolver o digest de novo:
281
295
 
296
+ ![dockerls base . repinando o digest](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_pin_digest.svg)
297
+
298
+ <details>
299
+ <summary>Ver como texto (copiar/colar)</summary>
300
+
282
301
  ```console
283
302
  $ sed -i 's/FROM node:22-alpine@\${BASE_DIGEST}/FROM node:20-alpine/; s/ARG BASE_DIGEST=.*/ARG BASE_DIGEST=/' Dockerfile
284
303
  $ dockerls base .
@@ -300,6 +319,8 @@ Rebuild and scan before publishing: changing the base digest changes the image,
300
319
  and only a scan tells you whether for the better.
301
320
  ```
302
321
 
322
+ </details>
323
+
303
324
  `base` não sabe (nem tenta adivinhar) se a troca de versão é segura — ele só
304
325
  garante que, seja qual for a tag, ela fica pinada por digest antes de ir pra
305
326
  frente. A resposta sobre segurança vem do scan, no passo 5.
@@ -315,6 +336,11 @@ do PowerShell inteiro a partir dali.
315
336
 
316
337
  ### 4. Validar antes de construir
317
338
 
339
+ ![resultado do analyze-dockerfile](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/analyze_dockerfile.svg)
340
+
341
+ <details>
342
+ <summary>Ver como texto (copiar/colar)</summary>
343
+
318
344
  ```console
319
345
  $ dockerls analyze-dockerfile .
320
346
 
@@ -342,6 +368,8 @@ Summary: 9 passed | 4 warnings | 0 errors
342
368
  Security Score: 90/100 Tier: A Production Ready: Yes
343
369
  ```
344
370
 
371
+ </details>
372
+
345
373
  Isso roda sem Docker, sem scanner, sem rede — é análise estática do texto do
346
374
  Dockerfile. Os warnings aqui (sem multi-stage, sem HEALTHCHECK, sem
347
375
  `.dockerignore`) são exatamente o que aparece de novo como sugestão depois do
@@ -357,6 +385,11 @@ findings (base vs. suas camadas). `--fail-on critical,kev` soma mais um
357
385
  critério: falhar também se algum CVE encontrado está no catálogo CISA KEV —
358
386
  sendo explorado ativamente, mesmo que não seja CRITICAL.
359
387
 
388
+ ![dockerls build --production com o gate de segurança](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/build_production.svg)
389
+
390
+ <details>
391
+ <summary>Ver como texto (copiar/colar)</summary>
392
+
360
393
  ```console
361
394
  $ dockerls build . -t minhaapp:1.0 --production --fail-on critical,kev `
362
395
  --owner "team-x" `
@@ -404,6 +437,8 @@ OUTPUT (measured after the build)
404
437
  Image sha256:5e5a079bbd616d166b155f15dac48c9c603a9d605876c732fde620a7aa7958bc
405
438
  ```
406
439
 
440
+ </details>
441
+
407
442
  Sem `--owner`, `--source` e `--security-contact`, esse mesmo comando falha —
408
443
  de propósito: `required_labels` é parte do perfil `--production`, e o motivo
409
444
  está no próprio erro quando isso acontece: "sem isso ninguém sabe pra quem
@@ -411,17 +446,29 @@ ligar quando essa imagem aparecer num alerta às três da manhã".
411
446
 
412
447
  ### 6. Usando a imagem depois de construída
413
448
 
449
+ ![docker run --rm minhaapp:1.0 id](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/docker_run_id.svg)
450
+
451
+ <details>
452
+ <summary>Ver como texto (copiar/colar)</summary>
453
+
414
454
  ```console
415
455
  $ docker run --rm minhaapp:1.0 id
416
456
  uid=1000(node) gid=1000(node) groups=1000(node),1000(node)
417
457
  ```
418
458
 
459
+ </details>
460
+
419
461
  `uid=1000`, não `uid=0`. É o `USER node` do Dockerfile confirmado em
420
462
  execução, não só lido no texto — a mesma checagem que `non_root_user` faz de
421
463
  forma estática no passo 4, agora contra o container de verdade.
422
464
 
423
465
  ### 7. Fechando o loop
424
466
 
467
+ ![dockerls analyze minhaapp:1.0 (imagem já construída)](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/analyze_final.svg)
468
+
469
+ <details>
470
+ <summary>Ver como texto (copiar/colar)</summary>
471
+
425
472
  ```console
426
473
  $ dockerls analyze minhaapp:1.0
427
474
 
@@ -441,6 +488,8 @@ Analysis: minhaapp:1.0
441
488
  Scanner trivy
442
489
  ```
443
490
 
491
+ </details>
492
+
444
493
  O mesmo `analyze` que você rodaria contra `node:22-alpine` pra decidir se
445
494
  confia nela funciona igual contra o que você acabou de construir. Não existe
446
495
  um comando separado pra "auditar a própria imagem" — é o mesmo raio-x, na
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dockerls
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Enterprise Docker Image Security Advisor
5
5
  Author: Ivomsantiago
6
6
  License: MIT
@@ -253,6 +253,11 @@ preciso". `base-image` faz essa escolha acontecer antes de qualquer coisa
253
253
  existir: sem `--with`, ele mostra um menu com o custo de cada pacote em
254
254
  superfície de ataque, não só o que ele serve.
255
255
 
256
+ ![menu de pacotes do base-image](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_image_menu.svg)
257
+
258
+ <details>
259
+ <summary>Ver como texto (copiar/colar)</summary>
260
+
256
261
  ```console
257
262
  $ dockerls base-image --os alpine --runtime node
258
263
 
@@ -288,6 +293,8 @@ processes
288
293
  Comma-separated numbers (empty = no packages): 1,2,9
289
294
  ```
290
295
 
296
+ </details>
297
+
291
298
  Repare no `curl`: o propósito ("HEALTHCHECK e diagnóstico de rede") é
292
299
  legítimo, mas o custo dito ali do lado é o mesmo que um atacante usa pra
293
300
  buscar o segundo estágio de um ataque. O menu não esconde isso pra depois —
@@ -296,6 +303,11 @@ mostra na hora de marcar.
296
303
  Em pipeline não tem menu pra responder. `--with` aceita a mesma lista
297
304
  separada por vírgula e pula direto pro Dockerfile:
298
305
 
306
+ ![base-image com --with, gerando o Dockerfile](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_image_with.svg)
307
+
308
+ <details>
309
+ <summary>Ver como texto (copiar/colar)</summary>
310
+
299
311
  ```console
300
312
  $ dockerls base-image --os alpine --runtime node \
301
313
  --with "ca-certificates,tzdata,tini" -o Dockerfile \
@@ -311,6 +323,8 @@ Next step
311
323
  until then it is only an intention.
312
324
  ```
313
325
 
326
+ </details>
327
+
314
328
  Existem três pacotes que esse catálogo se recusa a oferecer, mesmo por
315
329
  `--with` — são recusas documentadas, não omissões:
316
330
 
@@ -330,6 +344,11 @@ travada no catálogo (`RUNTIME_BASES`, em
330
344
  pra cada um. Se você precisa de outra versão, o caminho é editar a linha
331
345
  `FROM` manualmente e resolver o digest de novo:
332
346
 
347
+ ![dockerls base . repinando o digest](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/base_pin_digest.svg)
348
+
349
+ <details>
350
+ <summary>Ver como texto (copiar/colar)</summary>
351
+
333
352
  ```console
334
353
  $ sed -i 's/FROM node:22-alpine@\${BASE_DIGEST}/FROM node:20-alpine/; s/ARG BASE_DIGEST=.*/ARG BASE_DIGEST=/' Dockerfile
335
354
  $ dockerls base .
@@ -351,6 +370,8 @@ Rebuild and scan before publishing: changing the base digest changes the image,
351
370
  and only a scan tells you whether for the better.
352
371
  ```
353
372
 
373
+ </details>
374
+
354
375
  `base` não sabe (nem tenta adivinhar) se a troca de versão é segura — ele só
355
376
  garante que, seja qual for a tag, ela fica pinada por digest antes de ir pra
356
377
  frente. A resposta sobre segurança vem do scan, no passo 5.
@@ -366,6 +387,11 @@ do PowerShell inteiro a partir dali.
366
387
 
367
388
  ### 4. Validar antes de construir
368
389
 
390
+ ![resultado do analyze-dockerfile](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/analyze_dockerfile.svg)
391
+
392
+ <details>
393
+ <summary>Ver como texto (copiar/colar)</summary>
394
+
369
395
  ```console
370
396
  $ dockerls analyze-dockerfile .
371
397
 
@@ -393,6 +419,8 @@ Summary: 9 passed | 4 warnings | 0 errors
393
419
  Security Score: 90/100 Tier: A Production Ready: Yes
394
420
  ```
395
421
 
422
+ </details>
423
+
396
424
  Isso roda sem Docker, sem scanner, sem rede — é análise estática do texto do
397
425
  Dockerfile. Os warnings aqui (sem multi-stage, sem HEALTHCHECK, sem
398
426
  `.dockerignore`) são exatamente o que aparece de novo como sugestão depois do
@@ -408,6 +436,11 @@ findings (base vs. suas camadas). `--fail-on critical,kev` soma mais um
408
436
  critério: falhar também se algum CVE encontrado está no catálogo CISA KEV —
409
437
  sendo explorado ativamente, mesmo que não seja CRITICAL.
410
438
 
439
+ ![dockerls build --production com o gate de segurança](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/build_production.svg)
440
+
441
+ <details>
442
+ <summary>Ver como texto (copiar/colar)</summary>
443
+
411
444
  ```console
412
445
  $ dockerls build . -t minhaapp:1.0 --production --fail-on critical,kev `
413
446
  --owner "team-x" `
@@ -455,6 +488,8 @@ OUTPUT (measured after the build)
455
488
  Image sha256:5e5a079bbd616d166b155f15dac48c9c603a9d605876c732fde620a7aa7958bc
456
489
  ```
457
490
 
491
+ </details>
492
+
458
493
  Sem `--owner`, `--source` e `--security-contact`, esse mesmo comando falha —
459
494
  de propósito: `required_labels` é parte do perfil `--production`, e o motivo
460
495
  está no próprio erro quando isso acontece: "sem isso ninguém sabe pra quem
@@ -462,17 +497,29 @@ ligar quando essa imagem aparecer num alerta às três da manhã".
462
497
 
463
498
  ### 6. Usando a imagem depois de construída
464
499
 
500
+ ![docker run --rm minhaapp:1.0 id](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/docker_run_id.svg)
501
+
502
+ <details>
503
+ <summary>Ver como texto (copiar/colar)</summary>
504
+
465
505
  ```console
466
506
  $ docker run --rm minhaapp:1.0 id
467
507
  uid=1000(node) gid=1000(node) groups=1000(node),1000(node)
468
508
  ```
469
509
 
510
+ </details>
511
+
470
512
  `uid=1000`, não `uid=0`. É o `USER node` do Dockerfile confirmado em
471
513
  execução, não só lido no texto — a mesma checagem que `non_root_user` faz de
472
514
  forma estática no passo 4, agora contra o container de verdade.
473
515
 
474
516
  ### 7. Fechando o loop
475
517
 
518
+ ![dockerls analyze minhaapp:1.0 (imagem já construída)](https://raw.githubusercontent.com/Ivomsantiago/DockerLs/Master/docs/assets/analyze_final.svg)
519
+
520
+ <details>
521
+ <summary>Ver como texto (copiar/colar)</summary>
522
+
476
523
  ```console
477
524
  $ dockerls analyze minhaapp:1.0
478
525
 
@@ -492,6 +539,8 @@ Analysis: minhaapp:1.0
492
539
  Scanner trivy
493
540
  ```
494
541
 
542
+ </details>
543
+
495
544
  O mesmo `analyze` que você rodaria contra `node:22-alpine` pra decidir se
496
545
  confia nela funciona igual contra o que você acabou de construir. Não existe
497
546
  um comando separado pra "auditar a própria imagem" — é o mesmo raio-x, na
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dockerls"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "Enterprise Docker Image Security Advisor"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes
File without changes