@enjoys/context-engine 1.7.0 → 1.7.1

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 (484) hide show
  1. package/data/color/abap.json +8 -8
  2. package/data/color/angular.json +11 -36
  3. package/data/color/apex.json +8 -8
  4. package/data/color/awk.json +40 -80
  5. package/data/color/azcli.json +8 -8
  6. package/data/color/bicep.json +8 -8
  7. package/data/color/c.json +4 -4
  8. package/data/color/caddy.json +8 -8
  9. package/data/color/cameligo.json +8 -8
  10. package/data/color/clojure.json +8 -8
  11. package/data/color/coffee.json +10 -17
  12. package/data/color/cpp.json +4 -4
  13. package/data/color/crontab.json +8 -8
  14. package/data/color/csharp.json +49 -109
  15. package/data/color/css.json +8 -32
  16. package/data/color/cypher.json +8 -8
  17. package/data/color/docker-compose.json +8 -8
  18. package/data/color/dockerfile.json +8 -8
  19. package/data/color/doctest.json +8 -8
  20. package/data/color/dotenv.json +8 -8
  21. package/data/color/ecl.json +8 -8
  22. package/data/color/elixir.json +49 -109
  23. package/data/color/flow9.json +8 -8
  24. package/data/color/freemarker2.json +61 -121
  25. package/data/color/go.json +4 -4
  26. package/data/color/graphql.json +8 -8
  27. package/data/color/hcl.json +8 -8
  28. package/data/color/html.json +13 -43
  29. package/data/color/ini.json +8 -8
  30. package/data/color/java.json +49 -109
  31. package/data/color/javascript.json +13 -43
  32. package/data/color/json.json +8 -8
  33. package/data/color/julia.json +49 -109
  34. package/data/color/less.json +10 -17
  35. package/data/color/lexon.json +8 -8
  36. package/data/color/liquid.json +61 -121
  37. package/data/color/lua.json +4 -4
  38. package/data/color/m3.json +8 -8
  39. package/data/color/makefile.json +8 -8
  40. package/data/color/markdown.json +61 -121
  41. package/data/color/mdx.json +61 -121
  42. package/data/color/mips.json +8 -8
  43. package/data/color/msdax.json +8 -8
  44. package/data/color/mysql.json +8 -8
  45. package/data/color/nestjs.json +52 -18
  46. package/data/color/nextjs.json +60 -22
  47. package/data/color/nginx.json +8 -8
  48. package/data/color/objective-c.json +4 -4
  49. package/data/color/pascal.json +8 -8
  50. package/data/color/pascaligo.json +8 -8
  51. package/data/color/perl.json +4 -4
  52. package/data/color/pgsql.json +8 -8
  53. package/data/color/php.json +13 -43
  54. package/data/color/pla.json +8 -8
  55. package/data/color/postiats.json +8 -8
  56. package/data/color/powerquery.json +8 -8
  57. package/data/color/powershell.json +40 -80
  58. package/data/color/protobuf.json +8 -8
  59. package/data/color/python.json +49 -109
  60. package/data/color/qsharp.json +8 -8
  61. package/data/color/r.json +49 -109
  62. package/data/color/razor.json +61 -121
  63. package/data/color/react.json +65 -93
  64. package/data/color/redis-cli.json +8 -8
  65. package/data/color/redis.json +8 -8
  66. package/data/color/redshift.json +8 -8
  67. package/data/color/restructuredtext.json +8 -8
  68. package/data/color/ruby.json +49 -109
  69. package/data/color/rust.json +4 -4
  70. package/data/color/sb.json +8 -8
  71. package/data/color/scala.json +2 -12
  72. package/data/color/scheme.json +8 -8
  73. package/data/color/scss.json +10 -17
  74. package/data/color/shadcn.json +11 -36
  75. package/data/color/shell.json +8 -48
  76. package/data/color/sol.json +8 -8
  77. package/data/color/sparql.json +8 -8
  78. package/data/color/sql.json +8 -8
  79. package/data/color/ssh_config.json +8 -8
  80. package/data/color/st.json +8 -8
  81. package/data/color/swift.json +56 -37
  82. package/data/color/systemd.json +8 -8
  83. package/data/color/systemverilog.json +8 -8
  84. package/data/color/tailwindcss.json +6 -24
  85. package/data/color/tcl.json +40 -80
  86. package/data/color/toml.json +8 -8
  87. package/data/color/twig.json +61 -121
  88. package/data/color/typescript.json +13 -43
  89. package/data/color/vb.json +49 -109
  90. package/data/color/wgsl.json +8 -8
  91. package/data/color/xml.json +61 -121
  92. package/data/color/yaml.json +8 -8
  93. package/data/commands/air.json +117 -59
  94. package/data/commands/alembic.json +487 -301
  95. package/data/commands/ansible.json +236 -24
  96. package/data/commands/apt-get.json +244 -81
  97. package/data/commands/apt.json +294 -91
  98. package/data/commands/atlas.json +956 -426
  99. package/data/commands/aws-vault.json +266 -140
  100. package/data/commands/bazel.json +328 -103
  101. package/data/commands/brew.json +444 -140
  102. package/data/commands/btop.json +132 -59
  103. package/data/commands/cabal.json +1 -1
  104. package/data/commands/cd.json +90 -48
  105. package/data/commands/choco.json +430 -134
  106. package/data/commands/chown.json +139 -59
  107. package/data/commands/clickhouse-client.json +183 -74
  108. package/data/commands/cmake.json +301 -110
  109. package/data/commands/cockroach.json +269 -92
  110. package/data/commands/conda.json +435 -94
  111. package/data/commands/consul.json +377 -125
  112. package/data/commands/crystal.json +1 -1
  113. package/data/commands/dbmate.json +498 -257
  114. package/data/commands/django-admin.json +489 -86
  115. package/data/commands/dnf.json +428 -137
  116. package/data/commands/dockerfile.json +1 -1
  117. package/data/commands/dotnet.json +1 -1
  118. package/data/commands/drizzle-kit.json +435 -217
  119. package/data/commands/erlang.json +1 -1
  120. package/data/commands/eslint.json +193 -69
  121. package/data/commands/expo.json +65 -65
  122. package/data/commands/firebase.json +406 -97
  123. package/data/commands/flask.json +254 -79
  124. package/data/commands/flyctl.json +657 -148
  125. package/data/commands/flyway.json +580 -261
  126. package/data/commands/ghc.json +1 -1
  127. package/data/commands/glab.json +577 -116
  128. package/data/commands/gofmt.json +101 -51
  129. package/data/commands/golangci-lint.json +243 -89
  130. package/data/commands/gradle.json +182 -44
  131. package/data/commands/gunicorn.json +243 -83
  132. package/data/commands/hg.json +502 -92
  133. package/data/commands/htop.json +151 -56
  134. package/data/commands/influx.json +363 -119
  135. package/data/commands/iptables.json +251 -86
  136. package/data/commands/javac.json +1 -1
  137. package/data/commands/just.json +262 -93
  138. package/data/commands/linode-cli.json +360 -117
  139. package/data/commands/linux.json +1 -1
  140. package/data/commands/liquibase.json +739 -399
  141. package/data/commands/manifest.json +1 -1
  142. package/data/commands/mix.json +1 -1
  143. package/data/commands/mongosh.json +174 -73
  144. package/data/commands/mvn.json +179 -45
  145. package/data/commands/mysql.json +1 -1
  146. package/data/commands/nest.json +270 -69
  147. package/data/commands/netlify.json +384 -92
  148. package/data/commands/next.json +221 -71
  149. package/data/commands/nft.json +299 -105
  150. package/data/commands/nim.json +1 -1
  151. package/data/commands/nomad.json +398 -139
  152. package/data/commands/npx.json +141 -58
  153. package/data/commands/nx.json +348 -82
  154. package/data/commands/ocaml.json +1 -1
  155. package/data/commands/opam.json +1 -1
  156. package/data/commands/packer.json +273 -92
  157. package/data/commands/pacman.json +228 -82
  158. package/data/commands/pg_dump.json +233 -83
  159. package/data/commands/pg_restore.json +224 -74
  160. package/data/commands/pipenv.json +300 -79
  161. package/data/commands/pipx.json +241 -53
  162. package/data/commands/poetry.json +521 -96
  163. package/data/commands/prettier.json +201 -71
  164. package/data/commands/pulumi.json +409 -130
  165. package/data/commands/pytest.json +240 -92
  166. package/data/commands/railway.json +343 -91
  167. package/data/commands/react-native.json +57 -57
  168. package/data/commands/rebar3.json +1 -1
  169. package/data/commands/render.json +235 -72
  170. package/data/commands/rustc.json +1 -1
  171. package/data/commands/rustup.json +339 -103
  172. package/data/commands/scala.json +1 -1
  173. package/data/commands/scp.json +146 -60
  174. package/data/commands/sequelize.json +629 -342
  175. package/data/commands/sqlite3.json +167 -68
  176. package/data/commands/stack.json +1 -1
  177. package/data/commands/supabase.json +433 -108
  178. package/data/commands/svn.json +509 -75
  179. package/data/commands/swiftc.json +1 -1
  180. package/data/commands/terraform.json +1505 -824
  181. package/data/commands/terragrunt.json +217 -83
  182. package/data/commands/top.json +167 -61
  183. package/data/commands/tsc.json +234 -85
  184. package/data/commands/turbo.json +263 -72
  185. package/data/commands/typeorm.json +427 -262
  186. package/data/commands/ufw.json +254 -76
  187. package/data/commands/unzip.json +154 -59
  188. package/data/commands/uvicorn.json +215 -73
  189. package/data/commands/vault.json +462 -144
  190. package/data/commands/vercel.json +410 -98
  191. package/data/commands/vite.json +239 -63
  192. package/data/commands/wasm-pack.json +254 -90
  193. package/data/commands/winget.json +466 -131
  194. package/data/commands/yum.json +323 -98
  195. package/data/commands/zig.json +1 -1
  196. package/data/commands/zip.json +159 -59
  197. package/data/completion/abap.json +423 -341
  198. package/data/completion/apex.json +423 -43
  199. package/data/completion/awk.json +1 -45
  200. package/data/completion/azcli.json +58 -115
  201. package/data/completion/bicep.json +90 -90
  202. package/data/completion/cameligo.json +533 -487
  203. package/data/completion/clojure.json +533 -488
  204. package/data/completion/coffee.json +522 -479
  205. package/data/completion/crontab.json +1 -34
  206. package/data/completion/cypher.json +687 -628
  207. package/data/completion/docker-compose.json +962 -959
  208. package/data/completion/dockerfile.json +1270 -1285
  209. package/data/completion/doctest.json +489 -526
  210. package/data/completion/ecl.json +588 -598
  211. package/data/completion/elixir.json +709 -649
  212. package/data/completion/flow9.json +401 -376
  213. package/data/completion/freemarker2.json +632 -579
  214. package/data/completion/go.json +10037 -10037
  215. package/data/completion/julia.json +698 -638
  216. package/data/completion/less.json +412 -378
  217. package/data/completion/lexon.json +80 -52
  218. package/data/completion/liquid.json +544 -499
  219. package/data/completion/lua.json +2535 -2634
  220. package/data/completion/m3.json +643 -587
  221. package/data/completion/makefile.json +1 -56
  222. package/data/completion/markdown.json +1 -56
  223. package/data/completion/mips.json +83 -49
  224. package/data/completion/msdax.json +511 -467
  225. package/data/completion/mysql.json +676 -638
  226. package/data/completion/objective-c.json +687 -629
  227. package/data/completion/pascal.json +709 -649
  228. package/data/completion/pascaligo.json +544 -517
  229. package/data/completion/perl.json +1 -89
  230. package/data/completion/pgsql.json +698 -638
  231. package/data/completion/postiats.json +445 -417
  232. package/data/completion/powerquery.json +621 -587
  233. package/data/completion/powershell.json +1 -166
  234. package/data/completion/protobuf.json +7 -117
  235. package/data/completion/qsharp.json +643 -587
  236. package/data/completion/r.json +2469 -1985
  237. package/data/completion/razor.json +533 -488
  238. package/data/completion/redis-cli.json +120 -60
  239. package/data/completion/redis.json +423 -389
  240. package/data/completion/redshift.json +698 -638
  241. package/data/completion/restructuredtext.json +544 -499
  242. package/data/completion/ruby.json +1930 -1531
  243. package/data/completion/sb.json +434 -398
  244. package/data/completion/scheme.json +555 -510
  245. package/data/completion/scss.json +544 -500
  246. package/data/completion/shell.json +115 -70
  247. package/data/completion/sol.json +720 -660
  248. package/data/completion/sparql.json +643 -587
  249. package/data/completion/st.json +698 -638
  250. package/data/completion/systemverilog.json +698 -638
  251. package/data/completion/tailwindcss.json +2821 -284
  252. package/data/completion/tcl.json +544 -499
  253. package/data/completion/twig.json +555 -510
  254. package/data/completion/vb.json +720 -660
  255. package/data/completion/wgsl.json +709 -649
  256. package/data/foldingRange/abap.json +0 -24
  257. package/data/foldingRange/angular.json +0 -18
  258. package/data/foldingRange/apex.json +0 -24
  259. package/data/foldingRange/awk.json +0 -18
  260. package/data/foldingRange/azcli.json +0 -18
  261. package/data/foldingRange/bicep.json +0 -18
  262. package/data/foldingRange/c.json +0 -24
  263. package/data/foldingRange/caddy.json +0 -18
  264. package/data/foldingRange/cameligo.json +0 -18
  265. package/data/foldingRange/clojure.json +0 -18
  266. package/data/foldingRange/coffee.json +0 -18
  267. package/data/foldingRange/cpp.json +0 -24
  268. package/data/foldingRange/crontab.json +0 -18
  269. package/data/foldingRange/csharp.json +0 -24
  270. package/data/foldingRange/css.json +5 -19
  271. package/data/foldingRange/cypher.json +0 -18
  272. package/data/foldingRange/dart.json +0 -24
  273. package/data/foldingRange/docker-compose.json +0 -18
  274. package/data/foldingRange/dockerfile.json +0 -18
  275. package/data/foldingRange/doctest.json +0 -18
  276. package/data/foldingRange/dotenv.json +0 -18
  277. package/data/foldingRange/ecl.json +0 -30
  278. package/data/foldingRange/elixir.json +0 -24
  279. package/data/foldingRange/flow9.json +0 -12
  280. package/data/foldingRange/freemarker2.json +0 -12
  281. package/data/foldingRange/go.json +0 -24
  282. package/data/foldingRange/graphql.json +0 -12
  283. package/data/foldingRange/hcl.json +0 -12
  284. package/data/foldingRange/html.json +0 -18
  285. package/data/foldingRange/ini.json +0 -18
  286. package/data/foldingRange/java.json +0 -24
  287. package/data/foldingRange/javascript.json +0 -24
  288. package/data/foldingRange/json.json +0 -12
  289. package/data/foldingRange/julia.json +0 -12
  290. package/data/foldingRange/kotlin.json +0 -18
  291. package/data/foldingRange/less.json +0 -18
  292. package/data/foldingRange/lexon.json +0 -12
  293. package/data/foldingRange/liquid.json +0 -18
  294. package/data/foldingRange/lua.json +0 -24
  295. package/data/foldingRange/m3.json +0 -18
  296. package/data/foldingRange/makefile.json +0 -12
  297. package/data/foldingRange/markdown.json +0 -12
  298. package/data/foldingRange/mdx.json +0 -18
  299. package/data/foldingRange/mips.json +0 -18
  300. package/data/foldingRange/msdax.json +0 -12
  301. package/data/foldingRange/mysql.json +0 -18
  302. package/data/foldingRange/nestjs.json +0 -24
  303. package/data/foldingRange/nextjs.json +0 -24
  304. package/data/foldingRange/nginx.json +0 -12
  305. package/data/foldingRange/objective-c.json +0 -18
  306. package/data/foldingRange/pascal.json +0 -18
  307. package/data/foldingRange/pascaligo.json +0 -12
  308. package/data/foldingRange/perl.json +0 -18
  309. package/data/foldingRange/pgsql.json +0 -18
  310. package/data/foldingRange/php.json +0 -18
  311. package/data/foldingRange/pla.json +0 -12
  312. package/data/foldingRange/postiats.json +0 -18
  313. package/data/foldingRange/powerquery.json +0 -12
  314. package/data/foldingRange/powershell.json +0 -18
  315. package/data/foldingRange/protobuf.json +0 -12
  316. package/data/foldingRange/python.json +0 -18
  317. package/data/foldingRange/qsharp.json +0 -12
  318. package/data/foldingRange/r.json +0 -12
  319. package/data/foldingRange/razor.json +0 -18
  320. package/data/foldingRange/react.json +0 -24
  321. package/data/foldingRange/redis-cli.json +0 -12
  322. package/data/foldingRange/redis.json +0 -18
  323. package/data/foldingRange/redshift.json +0 -18
  324. package/data/foldingRange/restructuredtext.json +0 -12
  325. package/data/foldingRange/ruby.json +0 -24
  326. package/data/foldingRange/rust.json +0 -18
  327. package/data/foldingRange/sb.json +0 -18
  328. package/data/foldingRange/scala.json +0 -18
  329. package/data/foldingRange/scheme.json +0 -12
  330. package/data/foldingRange/scss.json +0 -18
  331. package/data/foldingRange/shadcn.json +0 -24
  332. package/data/foldingRange/shell.json +0 -18
  333. package/data/foldingRange/sol.json +0 -18
  334. package/data/foldingRange/sparql.json +0 -12
  335. package/data/foldingRange/sql.json +0 -18
  336. package/data/foldingRange/ssh_config.json +0 -12
  337. package/data/foldingRange/st.json +0 -18
  338. package/data/foldingRange/swift.json +0 -18
  339. package/data/foldingRange/systemd.json +0 -12
  340. package/data/foldingRange/systemverilog.json +0 -12
  341. package/data/foldingRange/tailwindcss.json +0 -12
  342. package/data/foldingRange/tcl.json +0 -18
  343. package/data/foldingRange/toml.json +0 -12
  344. package/data/foldingRange/twig.json +0 -12
  345. package/data/foldingRange/typescript.json +0 -24
  346. package/data/foldingRange/vb.json +0 -18
  347. package/data/foldingRange/wgsl.json +0 -12
  348. package/data/foldingRange/xml.json +0 -18
  349. package/data/foldingRange/yaml.json +0 -12
  350. package/data/formatting/awk.json +5 -5
  351. package/data/formatting/azcli.json +1 -1
  352. package/data/formatting/c.json +5 -5
  353. package/data/formatting/caddy.json +4 -4
  354. package/data/formatting/cpp.json +5 -5
  355. package/data/formatting/crontab.json +2 -2
  356. package/data/formatting/csharp.json +5 -5
  357. package/data/formatting/dockerfile.json +4 -3
  358. package/data/formatting/dotenv.json +2 -2
  359. package/data/formatting/elixir.json +3 -3
  360. package/data/formatting/go.json +5 -5
  361. package/data/formatting/graphql.json +4 -4
  362. package/data/formatting/hcl.json +8 -8
  363. package/data/formatting/html.json +8 -8
  364. package/data/formatting/ini.json +4 -3
  365. package/data/formatting/java.json +5 -5
  366. package/data/formatting/javascript.json +5 -5
  367. package/data/formatting/json.json +4 -4
  368. package/data/formatting/less.json +8 -4
  369. package/data/formatting/lua.json +5 -5
  370. package/data/formatting/makefile.json +8 -4
  371. package/data/formatting/markdown.json +4 -4
  372. package/data/formatting/mips.json +2 -1
  373. package/data/formatting/mysql.json +1 -1
  374. package/data/formatting/nginx.json +5 -5
  375. package/data/formatting/perl.json +5 -5
  376. package/data/formatting/pgsql.json +1 -1
  377. package/data/formatting/php.json +5 -5
  378. package/data/formatting/powershell.json +5 -5
  379. package/data/formatting/protobuf.json +4 -4
  380. package/data/formatting/python.json +5 -5
  381. package/data/formatting/r.json +6 -6
  382. package/data/formatting/redis-cli.json +2 -2
  383. package/data/formatting/redshift.json +1 -1
  384. package/data/formatting/restructuredtext.json +2 -1
  385. package/data/formatting/ruby.json +5 -5
  386. package/data/formatting/rust.json +5 -5
  387. package/data/formatting/scala.json +6 -2
  388. package/data/formatting/scss.json +8 -4
  389. package/data/formatting/shell.json +1 -16
  390. package/data/formatting/sql.json +5 -5
  391. package/data/formatting/ssh_config.json +4 -3
  392. package/data/formatting/swift.json +6 -2
  393. package/data/formatting/systemd.json +2 -2
  394. package/data/formatting/toml.json +4 -3
  395. package/data/formatting/typescript.json +5 -5
  396. package/data/formatting/xml.json +8 -8
  397. package/data/formatting/yaml.json +4 -3
  398. package/data/links/abap.json +14 -14
  399. package/data/links/apex.json +18 -18
  400. package/data/links/awk.json +20 -20
  401. package/data/links/azcli.json +20 -20
  402. package/data/links/bicep.json +12 -12
  403. package/data/links/c.json +22 -22
  404. package/data/links/caddy.json +22 -22
  405. package/data/links/cameligo.json +20 -20
  406. package/data/links/clojure.json +12 -12
  407. package/data/links/coffee.json +14 -14
  408. package/data/links/cpp.json +22 -22
  409. package/data/links/crontab.json +22 -22
  410. package/data/links/csharp.json +22 -22
  411. package/data/links/cypher.json +18 -18
  412. package/data/links/dart.json +2 -2
  413. package/data/links/docker-compose.json +8 -8
  414. package/data/links/dockerfile.json +22 -22
  415. package/data/links/doctest.json +20 -20
  416. package/data/links/dotenv.json +20 -20
  417. package/data/links/ecl.json +18 -18
  418. package/data/links/elixir.json +12 -12
  419. package/data/links/flow9.json +22 -22
  420. package/data/links/freemarker2.json +10 -10
  421. package/data/links/go.json +23 -23
  422. package/data/links/graphql.json +18 -18
  423. package/data/links/hcl.json +22 -22
  424. package/data/links/html.json +19 -19
  425. package/data/links/ini.json +20 -20
  426. package/data/links/java.json +22 -22
  427. package/data/links/javascript.json +20 -20
  428. package/data/links/json.json +16 -16
  429. package/data/links/julia.json +16 -16
  430. package/data/links/kotlin.json +14 -14
  431. package/data/links/less.json +10 -10
  432. package/data/links/lexon.json +24 -24
  433. package/data/links/liquid.json +8 -8
  434. package/data/links/lua.json +22 -22
  435. package/data/links/m3.json +20 -20
  436. package/data/links/makefile.json +22 -22
  437. package/data/links/markdown.json +25 -25
  438. package/data/links/mdx.json +12 -12
  439. package/data/links/mips.json +22 -22
  440. package/data/links/msdax.json +22 -22
  441. package/data/links/mysql.json +17 -17
  442. package/data/links/nginx.json +22 -22
  443. package/data/links/objective-c.json +14 -14
  444. package/data/links/pascal.json +16 -16
  445. package/data/links/pascaligo.json +20 -20
  446. package/data/links/perl.json +22 -22
  447. package/data/links/pgsql.json +14 -14
  448. package/data/links/php.json +22 -22
  449. package/data/links/pla.json +24 -24
  450. package/data/links/postiats.json +18 -18
  451. package/data/links/powerquery.json +20 -20
  452. package/data/links/powershell.json +24 -24
  453. package/data/links/protobuf.json +22 -22
  454. package/data/links/python.json +27 -22
  455. package/data/links/qsharp.json +20 -20
  456. package/data/links/r.json +21 -21
  457. package/data/links/razor.json +8 -8
  458. package/data/links/redis-cli.json +22 -22
  459. package/data/links/redis.json +22 -22
  460. package/data/links/redshift.json +16 -16
  461. package/data/links/restructuredtext.json +10 -10
  462. package/data/links/ruby.json +22 -22
  463. package/data/links/rust.json +22 -22
  464. package/data/links/sb.json +24 -24
  465. package/data/links/scheme.json +12 -12
  466. package/data/links/scss.json +2 -2
  467. package/data/links/shell.json +1 -6
  468. package/data/links/sol.json +16 -16
  469. package/data/links/sparql.json +18 -18
  470. package/data/links/sql.json +18 -18
  471. package/data/links/ssh_config.json +22 -22
  472. package/data/links/st.json +20 -20
  473. package/data/links/swift.json +8 -8
  474. package/data/links/systemd.json +18 -18
  475. package/data/links/systemverilog.json +20 -20
  476. package/data/links/tcl.json +16 -16
  477. package/data/links/toml.json +16 -16
  478. package/data/links/typescript.json +20 -20
  479. package/data/links/vb.json +16 -16
  480. package/data/links/wgsl.json +24 -24
  481. package/data/links/xml.json +22 -22
  482. package/data/links/yaml.json +12 -12
  483. package/data/manifest.json +2 -2
  484. package/package.json +1 -1
@@ -1,1285 +1,1270 @@
1
- {
2
- "language": "dockerfile",
3
- "completions": [
4
- {
5
- "label": "FROM",
6
- "kind": 14,
7
- "detail": "Base image instruction",
8
- "documentation": {
9
- "value": "Set the base image for subsequent instructions. Every Dockerfile must start with FROM (except ARG before FROM)."
10
- },
11
- "insertText": "FROM",
12
- "sortText": "00_from"
13
- },
14
- {
15
- "label": "RUN",
16
- "kind": 14,
17
- "detail": "Execute command",
18
- "documentation": {
19
- "value": "Execute a command in a new layer on top of the current image and commit the result."
20
- },
21
- "insertText": "RUN",
22
- "sortText": "00_run"
23
- },
24
- {
25
- "label": "CMD",
26
- "kind": 14,
27
- "detail": "Default command",
28
- "documentation": {
29
- "value": "Provide defaults for an executing container. Only one CMD per Dockerfile; the last one wins."
30
- },
31
- "insertText": "CMD",
32
- "sortText": "00_cmd"
33
- },
34
- {
35
- "label": "LABEL",
36
- "kind": 14,
37
- "detail": "Metadata label",
38
- "documentation": {
39
- "value": "Add metadata key-value pairs to the image."
40
- },
41
- "insertText": "LABEL",
42
- "sortText": "00_label"
43
- },
44
- {
45
- "label": "MAINTAINER",
46
- "kind": 14,
47
- "detail": "Author (deprecated)",
48
- "documentation": {
49
- "value": "Set the Author field of the generated image. Deprecated in favor of LABEL."
50
- },
51
- "insertText": "MAINTAINER",
52
- "sortText": "00_maintainer"
53
- },
54
- {
55
- "label": "EXPOSE",
56
- "kind": 14,
57
- "detail": "Expose port",
58
- "documentation": {
59
- "value": "Inform Docker that the container listens on the specified network ports at runtime."
60
- },
61
- "insertText": "EXPOSE",
62
- "sortText": "00_expose"
63
- },
64
- {
65
- "label": "ENV",
66
- "kind": 14,
67
- "detail": "Environment variable",
68
- "documentation": {
69
- "value": "Set an environment variable that persists in the built image and running containers."
70
- },
71
- "insertText": "ENV",
72
- "sortText": "00_env"
73
- },
74
- {
75
- "label": "ADD",
76
- "kind": 14,
77
- "detail": "Add files",
78
- "documentation": {
79
- "value": "Copy files, directories, or remote URLs into the image filesystem. Automatically extracts tar archives."
80
- },
81
- "insertText": "ADD",
82
- "sortText": "00_add"
83
- },
84
- {
85
- "label": "COPY",
86
- "kind": 14,
87
- "detail": "Copy files",
88
- "documentation": {
89
- "value": "Copy files or directories from the build context into the image filesystem."
90
- },
91
- "insertText": "COPY",
92
- "sortText": "00_copy"
93
- },
94
- {
95
- "label": "ENTRYPOINT",
96
- "kind": 14,
97
- "detail": "Container entrypoint",
98
- "documentation": {
99
- "value": "Configure a container that will run as an executable."
100
- },
101
- "insertText": "ENTRYPOINT",
102
- "sortText": "00_entrypoint"
103
- },
104
- {
105
- "label": "VOLUME",
106
- "kind": 14,
107
- "detail": "Create mount point",
108
- "documentation": {
109
- "value": "Create a mount point with the specified name and mark it as holding externally mounted volumes."
110
- },
111
- "insertText": "VOLUME",
112
- "sortText": "00_volume"
113
- },
114
- {
115
- "label": "USER",
116
- "kind": 14,
117
- "detail": "Set user",
118
- "documentation": {
119
- "value": "Set the user name or UID (and optionally group) to use for RUN, CMD, and ENTRYPOINT instructions."
120
- },
121
- "insertText": "USER",
122
- "sortText": "00_user"
123
- },
124
- {
125
- "label": "WORKDIR",
126
- "kind": 14,
127
- "detail": "Set working directory",
128
- "documentation": {
129
- "value": "Set the working directory for RUN, CMD, ENTRYPOINT, COPY, and ADD instructions."
130
- },
131
- "insertText": "WORKDIR",
132
- "sortText": "00_workdir"
133
- },
134
- {
135
- "label": "ARG",
136
- "kind": 14,
137
- "detail": "Build argument",
138
- "documentation": {
139
- "value": "Define a build-time variable that users can pass with --build-arg."
140
- },
141
- "insertText": "ARG",
142
- "sortText": "00_arg"
143
- },
144
- {
145
- "label": "ONBUILD",
146
- "kind": 14,
147
- "detail": "Deferred instruction",
148
- "documentation": {
149
- "value": "Add a trigger instruction that executes when the image is used as a base for another build."
150
- },
151
- "insertText": "ONBUILD",
152
- "sortText": "00_onbuild"
153
- },
154
- {
155
- "label": "STOPSIGNAL",
156
- "kind": 14,
157
- "detail": "Stop signal",
158
- "documentation": {
159
- "value": "Set the system call signal that will be sent to the container to exit."
160
- },
161
- "insertText": "STOPSIGNAL",
162
- "sortText": "00_stopsignal"
163
- },
164
- {
165
- "label": "HEALTHCHECK",
166
- "kind": 14,
167
- "detail": "Health check",
168
- "documentation": {
169
- "value": "Tell Docker how to test a container to check that it is still working."
170
- },
171
- "insertText": "HEALTHCHECK",
172
- "sortText": "00_healthcheck"
173
- },
174
- {
175
- "label": "SHELL",
176
- "kind": 14,
177
- "detail": "Default shell",
178
- "documentation": {
179
- "value": "Override the default shell used for the shell form of commands."
180
- },
181
- "insertText": "SHELL",
182
- "sortText": "00_shell"
183
- },
184
- {
185
- "label": "FROM image",
186
- "kind": 15,
187
- "detail": "FROM with image",
188
- "documentation": {
189
- "value": "Basic FROM with image name."
190
- },
191
- "insertText": "FROM ${1:image}",
192
- "insertTextRules": 4,
193
- "sortText": "01_from_basic"
194
- },
195
- {
196
- "label": "FROM image:tag",
197
- "kind": 15,
198
- "detail": "FROM with tag",
199
- "documentation": {
200
- "value": "FROM with explicit image tag."
201
- },
202
- "insertText": "FROM ${1:image}:${2:tag}",
203
- "insertTextRules": 4,
204
- "sortText": "01_from_tag"
205
- },
206
- {
207
- "label": "FROM image AS stage",
208
- "kind": 15,
209
- "detail": "FROM multi-stage",
210
- "documentation": {
211
- "value": "FROM with AS alias for multi-stage builds."
212
- },
213
- "insertText": "FROM ${1:image}:${2:tag} AS ${3:builder}",
214
- "insertTextRules": 4,
215
- "sortText": "01_from_as"
216
- },
217
- {
218
- "label": "FROM --platform",
219
- "kind": 15,
220
- "detail": "FROM with platform",
221
- "documentation": {
222
- "value": "FROM with explicit platform for cross-compilation."
223
- },
224
- "insertText": "FROM --platform=${1|linux/amd64,linux/arm64,linux/arm/v7,\\$BUILDPLATFORM,\\$TARGETPLATFORM|} ${2:image}:${3:tag}",
225
- "insertTextRules": 4,
226
- "sortText": "01_from_platform"
227
- },
228
- {
229
- "label": "FROM --platform AS",
230
- "kind": 15,
231
- "detail": "FROM platform + stage",
232
- "documentation": {
233
- "value": "FROM with platform and stage alias."
234
- },
235
- "insertText": "FROM --platform=${1|linux/amd64,linux/arm64,\\$BUILDPLATFORM,\\$TARGETPLATFORM|} ${2:image}:${3:tag} AS ${4:stage}",
236
- "insertTextRules": 4,
237
- "sortText": "01_from_platform_as"
238
- },
239
- {
240
- "label": "FROM scratch",
241
- "kind": 15,
242
- "detail": "FROM scratch (empty)",
243
- "documentation": {
244
- "value": "Start from an empty image, used for statically linked binaries."
245
- },
246
- "insertText": "FROM scratch",
247
- "insertTextRules": 4,
248
- "sortText": "01_from_scratch"
249
- },
250
- {
251
- "label": "RUN shell",
252
- "kind": 15,
253
- "detail": "RUN shell form",
254
- "documentation": {
255
- "value": "Execute command in shell form (/bin/sh -c)."
256
- },
257
- "insertText": "RUN ${1:command}",
258
- "insertTextRules": 4,
259
- "sortText": "02_run_shell"
260
- },
261
- {
262
- "label": "RUN exec",
263
- "kind": 15,
264
- "detail": "RUN exec form",
265
- "documentation": {
266
- "value": "Execute command in exec form (no shell processing)."
267
- },
268
- "insertText": "RUN [\"${1:executable}\", \"${2:arg1}\", \"${3:arg2}\"]",
269
- "insertTextRules": 4,
270
- "sortText": "02_run_exec"
271
- },
272
- {
273
- "label": "RUN --mount=cache",
274
- "kind": 15,
275
- "detail": "RUN with cache mount",
276
- "documentation": {
277
- "value": "Mount a persistent cache directory for package managers."
278
- },
279
- "insertText": "RUN --mount=type=cache,target=${1:/var/cache/apt} \\\n ${2:apt-get update && apt-get install -y package}",
280
- "insertTextRules": 4,
281
- "sortText": "02_run_mount_cache"
282
- },
283
- {
284
- "label": "RUN --mount=bind",
285
- "kind": 15,
286
- "detail": "RUN with bind mount",
287
- "documentation": {
288
- "value": "Bind mount a directory from the build context."
289
- },
290
- "insertText": "RUN --mount=type=bind,source=${1:src},target=${2:/app/src} \\\n ${3:command}",
291
- "insertTextRules": 4,
292
- "sortText": "02_run_mount_bind"
293
- },
294
- {
295
- "label": "RUN --mount=secret",
296
- "kind": 15,
297
- "detail": "RUN with secret mount",
298
- "documentation": {
299
- "value": "Mount a secret file without persisting in the image layer."
300
- },
301
- "insertText": "RUN --mount=type=secret,id=${1:mysecret},target=${2:/run/secrets/mysecret} \\\n ${3:cat /run/secrets/mysecret}",
302
- "insertTextRules": 4,
303
- "sortText": "02_run_mount_secret"
304
- },
305
- {
306
- "label": "RUN --mount=ssh",
307
- "kind": 15,
308
- "detail": "RUN with SSH mount",
309
- "documentation": {
310
- "value": "Forward SSH agent for private repo access during build."
311
- },
312
- "insertText": "RUN --mount=type=ssh \\\n ${1:git clone git@github.com:user/repo.git}",
313
- "insertTextRules": 4,
314
- "sortText": "02_run_mount_ssh"
315
- },
316
- {
317
- "label": "RUN --mount=tmpfs",
318
- "kind": 15,
319
- "detail": "RUN with tmpfs mount",
320
- "documentation": {
321
- "value": "Mount a tmpfs for temporary scratch space."
322
- },
323
- "insertText": "RUN --mount=type=tmpfs,target=${1:/tmp} \\\n ${2:command}",
324
- "insertTextRules": 4,
325
- "sortText": "02_run_mount_tmpfs"
326
- },
327
- {
328
- "label": "RUN heredoc",
329
- "kind": 15,
330
- "detail": "RUN with heredoc",
331
- "documentation": {
332
- "value": "Run multi-line script using heredoc syntax (BuildKit)."
333
- },
334
- "insertText": "RUN <<EOF\n${1:#!/bin/bash\nset -e\necho \"hello\"}\nEOF",
335
- "insertTextRules": 4,
336
- "sortText": "02_run_heredoc"
337
- },
338
- {
339
- "label": "RUN apt-get install",
340
- "kind": 15,
341
- "detail": "RUN apt-get best practice",
342
- "documentation": {
343
- "value": "Best practice apt-get install: update + install + clean in one layer."
344
- },
345
- "insertText": "RUN apt-get update && apt-get install -y --no-install-recommends \\\n ${1:package1} \\\n ${2:package2} \\\n && rm -rf /var/lib/apt/lists/*",
346
- "insertTextRules": 4,
347
- "sortText": "02_run_apt"
348
- },
349
- {
350
- "label": "RUN pip install",
351
- "kind": 15,
352
- "detail": "RUN pip install",
353
- "documentation": {
354
- "value": "Install Python packages with no cache for smaller images."
355
- },
356
- "insertText": "RUN pip install --no-cache-dir ${1:-r requirements.txt}",
357
- "insertTextRules": 4,
358
- "sortText": "02_run_pip"
359
- },
360
- {
361
- "label": "RUN npm ci",
362
- "kind": 15,
363
- "detail": "RUN npm ci",
364
- "documentation": {
365
- "value": "Install Node.js dependencies for reproducible builds."
366
- },
367
- "insertText": "RUN npm ci --only=production",
368
- "insertTextRules": 4,
369
- "sortText": "02_run_npm_ci"
370
- },
371
- {
372
- "label": "RUN apk add",
373
- "kind": 15,
374
- "detail": "RUN apk add (Alpine)",
375
- "documentation": {
376
- "value": "Install packages on Alpine Linux."
377
- },
378
- "insertText": "RUN apk add --no-cache \\\n ${1:package1} \\\n ${2:package2}",
379
- "insertTextRules": 4,
380
- "sortText": "02_run_apk"
381
- },
382
- {
383
- "label": "RUN --network=none",
384
- "kind": 15,
385
- "detail": "RUN without network",
386
- "documentation": {
387
- "value": "Run command with network disabled for security."
388
- },
389
- "insertText": "RUN --network=none ${1:command}",
390
- "insertTextRules": 4,
391
- "sortText": "02_run_network_none"
392
- },
393
- {
394
- "label": "RUN --security=insecure",
395
- "kind": 15,
396
- "detail": "RUN insecure (privileged)",
397
- "documentation": {
398
- "value": "Run with elevated privileges (requires security.insecure entitlement)."
399
- },
400
- "insertText": "RUN --security=insecure ${1:command}",
401
- "insertTextRules": 4,
402
- "sortText": "02_run_security"
403
- },
404
- {
405
- "label": "RUN useradd",
406
- "kind": 15,
407
- "detail": "RUN create user",
408
- "documentation": {
409
- "value": "Create a non-root user for running the application."
410
- },
411
- "insertText": "RUN groupadd -r ${1:appuser} && useradd -r -g ${1:appuser} -d /home/${1:appuser} -s /sbin/nologin ${1:appuser}",
412
- "insertTextRules": 4,
413
- "sortText": "02_run_useradd"
414
- },
415
- {
416
- "label": "RUN adduser Alpine",
417
- "kind": 15,
418
- "detail": "RUN create user (Alpine)",
419
- "documentation": {
420
- "value": "Create a non-root user on Alpine."
421
- },
422
- "insertText": "RUN addgroup -S ${1:appuser} && adduser -S ${1:appuser} -G ${1:appuser}",
423
- "insertTextRules": 4,
424
- "sortText": "02_run_adduser_alpine"
425
- },
426
- {
427
- "label": "CMD exec form",
428
- "kind": 15,
429
- "detail": "CMD exec form",
430
- "documentation": {
431
- "value": "Set default command in exec form (preferred)."
432
- },
433
- "insertText": "CMD [\"${1:executable}\", \"${2:arg1}\"]",
434
- "insertTextRules": 4,
435
- "sortText": "03_cmd_exec"
436
- },
437
- {
438
- "label": "CMD shell form",
439
- "kind": 15,
440
- "detail": "CMD shell form",
441
- "documentation": {
442
- "value": "Set default command in shell form."
443
- },
444
- "insertText": "CMD ${1:command arg1 arg2}",
445
- "insertTextRules": 4,
446
- "sortText": "03_cmd_shell"
447
- },
448
- {
449
- "label": "CMD as ENTRYPOINT params",
450
- "kind": 15,
451
- "detail": "CMD default parameters",
452
- "documentation": {
453
- "value": "Provide default parameters to ENTRYPOINT."
454
- },
455
- "insertText": "CMD [\"${1:--help}\"]",
456
- "insertTextRules": 4,
457
- "sortText": "03_cmd_params"
458
- },
459
- {
460
- "label": "ENTRYPOINT exec form",
461
- "kind": 15,
462
- "detail": "ENTRYPOINT exec form",
463
- "documentation": {
464
- "value": "Set entrypoint in exec form (preferred)."
465
- },
466
- "insertText": "ENTRYPOINT [\"${1:executable}\", \"${2:arg1}\"]",
467
- "insertTextRules": 4,
468
- "sortText": "04_entrypoint_exec"
469
- },
470
- {
471
- "label": "ENTRYPOINT shell form",
472
- "kind": 15,
473
- "detail": "ENTRYPOINT shell form",
474
- "documentation": {
475
- "value": "Set entrypoint in shell form."
476
- },
477
- "insertText": "ENTRYPOINT ${1:command arg1}",
478
- "insertTextRules": 4,
479
- "sortText": "04_entrypoint_shell"
480
- },
481
- {
482
- "label": "ENTRYPOINT with tini",
483
- "kind": 15,
484
- "detail": "ENTRYPOINT with tini",
485
- "documentation": {
486
- "value": "Use tini as PID 1 for proper signal handling."
487
- },
488
- "insertText": "ENTRYPOINT [\"tini\", \"--\", \"${1:executable}\"]",
489
- "insertTextRules": 4,
490
- "sortText": "04_entrypoint_tini"
491
- },
492
- {
493
- "label": "ENTRYPOINT with dumb-init",
494
- "kind": 15,
495
- "detail": "ENTRYPOINT with dumb-init",
496
- "documentation": {
497
- "value": "Use dumb-init as PID 1 for signal forwarding."
498
- },
499
- "insertText": "ENTRYPOINT [\"dumb-init\", \"--\", \"${1:executable}\"]",
500
- "insertTextRules": 4,
501
- "sortText": "04_entrypoint_dumb_init"
502
- },
503
- {
504
- "label": "COPY basic",
505
- "kind": 15,
506
- "detail": "COPY files",
507
- "documentation": {
508
- "value": "Copy files from build context into the image."
509
- },
510
- "insertText": "COPY ${1:src} ${2:dest}",
511
- "insertTextRules": 4,
512
- "sortText": "05_copy_basic"
513
- },
514
- {
515
- "label": "COPY --chown",
516
- "kind": 15,
517
- "detail": "COPY with chown",
518
- "documentation": {
519
- "value": "Copy files and set ownership."
520
- },
521
- "insertText": "COPY --chown=${1:user}:${2:group} ${3:src} ${4:dest}",
522
- "insertTextRules": 4,
523
- "sortText": "05_copy_chown"
524
- },
525
- {
526
- "label": "COPY --chmod",
527
- "kind": 15,
528
- "detail": "COPY with chmod",
529
- "documentation": {
530
- "value": "Copy files and set permissions (BuildKit)."
531
- },
532
- "insertText": "COPY --chmod=${1:755} ${2:src} ${3:dest}",
533
- "insertTextRules": 4,
534
- "sortText": "05_copy_chmod"
535
- },
536
- {
537
- "label": "COPY --from",
538
- "kind": 15,
539
- "detail": "COPY from stage",
540
- "documentation": {
541
- "value": "Copy files from a named build stage (multi-stage)."
542
- },
543
- "insertText": "COPY --from=${1:builder} ${2:/app/build} ${3:/usr/share/nginx/html}",
544
- "insertTextRules": 4,
545
- "sortText": "05_copy_from"
546
- },
547
- {
548
- "label": "COPY --link",
549
- "kind": 15,
550
- "detail": "COPY with link",
551
- "documentation": {
552
- "value": "Copy files using link mode for better cache efficiency."
553
- },
554
- "insertText": "COPY --link ${1:src} ${2:dest}",
555
- "insertTextRules": 4,
556
- "sortText": "05_copy_link"
557
- },
558
- {
559
- "label": "COPY package*.json",
560
- "kind": 15,
561
- "detail": "COPY package files first",
562
- "documentation": {
563
- "value": "Copy only package files first for better layer caching."
564
- },
565
- "insertText": "COPY package*.json ${1:./}\nRUN npm ci\nCOPY ${2:.} ${3:./}",
566
- "insertTextRules": 4,
567
- "sortText": "05_copy_package_cache"
568
- },
569
- {
570
- "label": "ADD basic",
571
- "kind": 15,
572
- "detail": "ADD files",
573
- "documentation": {
574
- "value": "Add files from build context (or URL/tar) into the image."
575
- },
576
- "insertText": "ADD ${1:src} ${2:dest}",
577
- "insertTextRules": 4,
578
- "sortText": "06_add_basic"
579
- },
580
- {
581
- "label": "ADD URL",
582
- "kind": 15,
583
- "detail": "ADD from URL",
584
- "documentation": {
585
- "value": "Download a file from a URL into the image."
586
- },
587
- "insertText": "ADD ${1:https://example.com/file.tar.gz} ${2:/tmp/}",
588
- "insertTextRules": 4,
589
- "sortText": "06_add_url"
590
- },
591
- {
592
- "label": "ADD tar",
593
- "kind": 15,
594
- "detail": "ADD tar auto-extract",
595
- "documentation": {
596
- "value": "Add and auto-extract a tar archive."
597
- },
598
- "insertText": "ADD ${1:archive.tar.gz} ${2:/opt/}",
599
- "insertTextRules": 4,
600
- "sortText": "06_add_tar"
601
- },
602
- {
603
- "label": "ADD --checksum",
604
- "kind": 15,
605
- "detail": "ADD with checksum",
606
- "documentation": {
607
- "value": "Add file with SHA256 checksum verification (BuildKit)."
608
- },
609
- "insertText": "ADD --checksum=sha256:${1:hash} ${2:https://example.com/file} ${3:/dest}",
610
- "insertTextRules": 4,
611
- "sortText": "06_add_checksum"
612
- },
613
- {
614
- "label": "ENV single",
615
- "kind": 15,
616
- "detail": "ENV single variable",
617
- "documentation": {
618
- "value": "Set a single environment variable."
619
- },
620
- "insertText": "ENV ${1:KEY}=${2:value}",
621
- "insertTextRules": 4,
622
- "sortText": "07_env_single"
623
- },
624
- {
625
- "label": "ENV multiple",
626
- "kind": 15,
627
- "detail": "ENV multiple variables",
628
- "documentation": {
629
- "value": "Set multiple environment variables."
630
- },
631
- "insertText": "ENV ${1:KEY1}=${2:value1} \\\n ${3:KEY2}=${4:value2}",
632
- "insertTextRules": 4,
633
- "sortText": "07_env_multiple"
634
- },
635
- {
636
- "label": "ENV PATH",
637
- "kind": 15,
638
- "detail": "ENV prepend PATH",
639
- "documentation": {
640
- "value": "Prepend a directory to PATH."
641
- },
642
- "insertText": "ENV PATH=\"${1:/app/bin}:$$PATH\"",
643
- "insertTextRules": 4,
644
- "sortText": "07_env_path"
645
- },
646
- {
647
- "label": "ENV NODE_ENV",
648
- "kind": 15,
649
- "detail": "ENV NODE_ENV production",
650
- "documentation": {
651
- "value": "Set Node.js production environment."
652
- },
653
- "insertText": "ENV NODE_ENV=production",
654
- "insertTextRules": 4,
655
- "sortText": "07_env_node"
656
- },
657
- {
658
- "label": "ENV PYTHONDONTWRITEBYTECODE",
659
- "kind": 15,
660
- "detail": "ENV Python optimizations",
661
- "documentation": {
662
- "value": "Common Python env vars for Docker."
663
- },
664
- "insertText": "ENV PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONUNBUFFERED=1",
665
- "insertTextRules": 4,
666
- "sortText": "07_env_python"
667
- },
668
- {
669
- "label": "ARG basic",
670
- "kind": 15,
671
- "detail": "ARG variable",
672
- "documentation": {
673
- "value": "Define a build-time argument."
674
- },
675
- "insertText": "ARG ${1:NAME}",
676
- "insertTextRules": 4,
677
- "sortText": "08_arg_basic"
678
- },
679
- {
680
- "label": "ARG with default",
681
- "kind": 15,
682
- "detail": "ARG with default value",
683
- "documentation": {
684
- "value": "Define a build arg with a default value."
685
- },
686
- "insertText": "ARG ${1:NAME}=${2:default}",
687
- "insertTextRules": 4,
688
- "sortText": "08_arg_default"
689
- },
690
- {
691
- "label": "ARG before FROM",
692
- "kind": 15,
693
- "detail": "ARG before FROM",
694
- "documentation": {
695
- "value": "Define ARG before FROM for use in FROM instruction."
696
- },
697
- "insertText": "ARG ${1:VERSION}=${2:latest}\nFROM ${3:node}:${1:VERSION}",
698
- "insertTextRules": 4,
699
- "sortText": "08_arg_before_from"
700
- },
701
- {
702
- "label": "EXPOSE port",
703
- "kind": 15,
704
- "detail": "EXPOSE single port",
705
- "documentation": {
706
- "value": "Expose a single port."
707
- },
708
- "insertText": "EXPOSE ${1:8080}",
709
- "insertTextRules": 4,
710
- "sortText": "09_expose_single"
711
- },
712
- {
713
- "label": "EXPOSE multiple",
714
- "kind": 15,
715
- "detail": "EXPOSE multiple ports",
716
- "documentation": {
717
- "value": "Expose multiple ports."
718
- },
719
- "insertText": "EXPOSE ${1:80} ${2:443}",
720
- "insertTextRules": 4,
721
- "sortText": "09_expose_multiple"
722
- },
723
- {
724
- "label": "EXPOSE UDP",
725
- "kind": 15,
726
- "detail": "EXPOSE UDP port",
727
- "documentation": {
728
- "value": "Expose a UDP port."
729
- },
730
- "insertText": "EXPOSE ${1:53}/udp",
731
- "insertTextRules": 4,
732
- "sortText": "09_expose_udp"
733
- },
734
- {
735
- "label": "VOLUME path",
736
- "kind": 15,
737
- "detail": "VOLUME mount point",
738
- "documentation": {
739
- "value": "Create a mount point."
740
- },
741
- "insertText": "VOLUME ${1:/data}",
742
- "insertTextRules": 4,
743
- "sortText": "10_volume"
744
- },
745
- {
746
- "label": "VOLUME JSON",
747
- "kind": 15,
748
- "detail": "VOLUME multiple",
749
- "documentation": {
750
- "value": "Create multiple mount points."
751
- },
752
- "insertText": "VOLUME [\"${1:/data}\", \"${2:/logs}\"]",
753
- "insertTextRules": 4,
754
- "sortText": "10_volume_json"
755
- },
756
- {
757
- "label": "USER name",
758
- "kind": 15,
759
- "detail": "USER set user",
760
- "documentation": {
761
- "value": "Switch to a non-root user."
762
- },
763
- "insertText": "USER ${1:appuser}",
764
- "insertTextRules": 4,
765
- "sortText": "11_user"
766
- },
767
- {
768
- "label": "USER uid:gid",
769
- "kind": 15,
770
- "detail": "USER with UID:GID",
771
- "documentation": {
772
- "value": "Switch to a specific UID:GID."
773
- },
774
- "insertText": "USER ${1:1001}:${2:1001}",
775
- "insertTextRules": 4,
776
- "sortText": "11_user_uid"
777
- },
778
- {
779
- "label": "WORKDIR path",
780
- "kind": 15,
781
- "detail": "WORKDIR set directory",
782
- "documentation": {
783
- "value": "Set the working directory."
784
- },
785
- "insertText": "WORKDIR ${1:/app}",
786
- "insertTextRules": 4,
787
- "sortText": "12_workdir"
788
- },
789
- {
790
- "label": "LABEL single",
791
- "kind": 15,
792
- "detail": "LABEL single",
793
- "documentation": {
794
- "value": "Add a single metadata label."
795
- },
796
- "insertText": "LABEL ${1:key}=\"${2:value}\"",
797
- "insertTextRules": 4,
798
- "sortText": "13_label_single"
799
- },
800
- {
801
- "label": "LABEL multiple",
802
- "kind": 15,
803
- "detail": "LABEL multiple",
804
- "documentation": {
805
- "value": "Add multiple metadata labels."
806
- },
807
- "insertText": "LABEL ${1:maintainer}=\"${2:name}\" \\\n ${3:version}=\"${4:1.0}\"",
808
- "insertTextRules": 4,
809
- "sortText": "13_label_multiple"
810
- },
811
- {
812
- "label": "LABEL OCI",
813
- "kind": 15,
814
- "detail": "LABEL OCI annotations",
815
- "documentation": {
816
- "value": "OCI image spec annotation labels."
817
- },
818
- "insertText": "LABEL org.opencontainers.image.title=\"${1:title}\" \\\n org.opencontainers.image.description=\"${2:description}\" \\\n org.opencontainers.image.version=\"${3:1.0.0}\" \\\n org.opencontainers.image.authors=\"${4:author}\" \\\n org.opencontainers.image.source=\"${5:https://github.com/user/repo}\" \\\n org.opencontainers.image.licenses=\"${6:MIT}\"",
819
- "insertTextRules": 4,
820
- "sortText": "13_label_oci"
821
- },
822
- {
823
- "label": "HEALTHCHECK CMD",
824
- "kind": 15,
825
- "detail": "HEALTHCHECK CMD",
826
- "documentation": {
827
- "value": "Health check with HTTP endpoint."
828
- },
829
- "insertText": "HEALTHCHECK --interval=${1:30s} --timeout=${2:10s} --start-period=${3:5s} --retries=${4:3} \\\n CMD ${5:curl -f http://localhost:${6:8080}/health || exit 1}",
830
- "insertTextRules": 4,
831
- "sortText": "14_healthcheck_cmd"
832
- },
833
- {
834
- "label": "HEALTHCHECK wget",
835
- "kind": 15,
836
- "detail": "HEALTHCHECK with wget",
837
- "documentation": {
838
- "value": "Health check using wget (for alpine/minimal images)."
839
- },
840
- "insertText": "HEALTHCHECK --interval=${1:30s} --timeout=${2:10s} --retries=${3:3} \\\n CMD wget --quiet --tries=1 --spider http://localhost:${4:8080}/health || exit 1",
841
- "insertTextRules": 4,
842
- "sortText": "14_healthcheck_wget"
843
- },
844
- {
845
- "label": "HEALTHCHECK NONE",
846
- "kind": 15,
847
- "detail": "HEALTHCHECK NONE",
848
- "documentation": {
849
- "value": "Disable health check inherited from base image."
850
- },
851
- "insertText": "HEALTHCHECK NONE",
852
- "insertTextRules": 4,
853
- "sortText": "14_healthcheck_none"
854
- },
855
- {
856
- "label": "SHELL bash",
857
- "kind": 15,
858
- "detail": "SHELL set to bash",
859
- "documentation": {
860
- "value": "Set default shell to bash."
861
- },
862
- "insertText": "SHELL [\"/bin/bash\", \"-c\"]",
863
- "insertTextRules": 4,
864
- "sortText": "15_shell_bash"
865
- },
866
- {
867
- "label": "SHELL powershell",
868
- "kind": 15,
869
- "detail": "SHELL set to PowerShell",
870
- "documentation": {
871
- "value": "Set default shell to PowerShell (Windows)."
872
- },
873
- "insertText": "SHELL [\"powershell\", \"-Command\"]",
874
- "insertTextRules": 4,
875
- "sortText": "15_shell_powershell"
876
- },
877
- {
878
- "label": "STOPSIGNAL",
879
- "kind": 15,
880
- "detail": "STOPSIGNAL",
881
- "documentation": {
882
- "value": "Set stop signal."
883
- },
884
- "insertText": "STOPSIGNAL ${1|SIGTERM,SIGQUIT,SIGINT,SIGKILL|}",
885
- "insertTextRules": 4,
886
- "sortText": "16_stopsignal"
887
- },
888
- {
889
- "label": "ONBUILD",
890
- "kind": 15,
891
- "detail": "ONBUILD trigger",
892
- "documentation": {
893
- "value": "Add instruction to execute when image is used as base."
894
- },
895
- "insertText": "ONBUILD ${1:RUN echo \"triggered\"}",
896
- "insertTextRules": 4,
897
- "sortText": "17_onbuild"
898
- },
899
- {
900
- "label": "# syntax=",
901
- "kind": 15,
902
- "detail": "syntax parser directive",
903
- "documentation": {
904
- "value": "Set BuildKit frontend syntax (must be first line)."
905
- },
906
- "insertText": "# syntax=docker/dockerfile:${1|1,1.4,1.5,1.6,1.7,labs|}",
907
- "insertTextRules": 4,
908
- "sortText": "00_syntax"
909
- },
910
- {
911
- "label": "# escape=",
912
- "kind": 15,
913
- "detail": "escape parser directive",
914
- "documentation": {
915
- "value": "Change the escape character (must be before any instruction)."
916
- },
917
- "insertText": "# escape=${1|\\\\,`|}",
918
- "insertTextRules": 4,
919
- "sortText": "00_escape"
920
- },
921
- {
922
- "label": "Dockerfile: Node.js multi-stage",
923
- "kind": 15,
924
- "detail": "Node.js multi-stage Dockerfile",
925
- "documentation": {
926
- "value": "Production-ready multi-stage Dockerfile for a Node.js application."
927
- },
928
- "insertText": "# syntax=docker/dockerfile:1\nFROM node:${1:20}-alpine AS deps\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nFROM node:${1:20}-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM node:${1:20}-alpine\nWORKDIR /app\nENV NODE_ENV=production\nRUN addgroup -S appuser && adduser -S appuser -G appuser\nCOPY --from=deps /app/node_modules ./node_modules\nCOPY --from=builder /app/dist ./dist\nCOPY package*.json ./\nUSER appuser\nEXPOSE ${2:3000}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD wget --quiet --tries=1 --spider http://localhost:${2:3000}/health || exit 1\nCMD [\"node\", \"dist/index.js\"]",
929
- "insertTextRules": 4,
930
- "sortText": "20_tmpl_node"
931
- },
932
- {
933
- "label": "Dockerfile: Python multi-stage",
934
- "kind": 15,
935
- "detail": "Python multi-stage Dockerfile",
936
- "documentation": {
937
- "value": "Production-ready multi-stage Dockerfile for a Python application."
938
- },
939
- "insertText": "# syntax=docker/dockerfile:1\nFROM python:${1:3.12}-slim AS builder\nWORKDIR /app\nENV PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONUNBUFFERED=1\nCOPY requirements.txt .\nRUN pip install --no-cache-dir --prefix=/install -r requirements.txt\n\nFROM python:${1:3.12}-slim\nWORKDIR /app\nENV PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONUNBUFFERED=1\nRUN groupadd -r appuser && useradd -r -g appuser appuser\nCOPY --from=builder /install /usr/local\nCOPY . .\nUSER appuser\nEXPOSE ${2:8000}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD python -c \"import urllib.request; urllib.request.urlopen('http://localhost:${2:8000}/health')\" || exit 1\nCMD [\"python\", \"-m\", \"${3:app}\"]",
940
- "insertTextRules": 4,
941
- "sortText": "20_tmpl_python"
942
- },
943
- {
944
- "label": "Dockerfile: Go multi-stage",
945
- "kind": 15,
946
- "detail": "Go multi-stage Dockerfile",
947
- "documentation": {
948
- "value": "Production-ready multi-stage Dockerfile for a Go application."
949
- },
950
- "insertText": "# syntax=docker/dockerfile:1\nFROM golang:${1:1.22}-alpine AS builder\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -ldflags=\"-s -w\" -o /app/server ./cmd/${2:server}\n\nFROM gcr.io/distroless/static-debian12\nCOPY --from=builder /app/server /server\nEXPOSE ${3:8080}\nUSER nonroot:nonroot\nENTRYPOINT [\"/server\"]",
951
- "insertTextRules": 4,
952
- "sortText": "20_tmpl_go"
953
- },
954
- {
955
- "label": "Dockerfile: Java Maven multi-stage",
956
- "kind": 15,
957
- "detail": "Java/Maven multi-stage Dockerfile",
958
- "documentation": {
959
- "value": "Production-ready multi-stage Dockerfile for a Java application built with Maven."
960
- },
961
- "insertText": "# syntax=docker/dockerfile:1\nFROM maven:${1:3.9}-eclipse-temurin-${2:21} AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests -B\n\nFROM eclipse-temurin:${2:21}-jre-alpine\nWORKDIR /app\nRUN addgroup -S appuser && adduser -S appuser -G appuser\nCOPY --from=builder /app/target/*.jar app.jar\nUSER appuser\nEXPOSE ${3:8080}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD wget --quiet --tries=1 --spider http://localhost:${3:8080}/actuator/health || exit 1\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]",
962
- "insertTextRules": 4,
963
- "sortText": "20_tmpl_java"
964
- },
965
- {
966
- "label": "Dockerfile: Rust multi-stage",
967
- "kind": 15,
968
- "detail": "Rust multi-stage Dockerfile",
969
- "documentation": {
970
- "value": "Production-ready multi-stage Dockerfile for a Rust application."
971
- },
972
- "insertText": "# syntax=docker/dockerfile:1\nFROM rust:${1:1.77}-slim AS builder\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nRUN mkdir src && echo \"fn main() {}\" > src/main.rs && cargo build --release && rm -rf src\nCOPY src ./src\nRUN cargo build --release\n\nFROM debian:${2:bookworm}-slim\nRUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \\\n && rm -rf /var/lib/apt/lists/*\nRUN groupadd -r appuser && useradd -r -g appuser appuser\nCOPY --from=builder /app/target/release/${3:myapp} /usr/local/bin/\nUSER appuser\nEXPOSE ${4:8080}\nENTRYPOINT [\"${3:myapp}\"]",
973
- "insertTextRules": 4,
974
- "sortText": "20_tmpl_rust"
975
- },
976
- {
977
- "label": "Dockerfile: .NET multi-stage",
978
- "kind": 15,
979
- "detail": ".NET multi-stage Dockerfile",
980
- "documentation": {
981
- "value": "Production-ready multi-stage Dockerfile for a .NET application."
982
- },
983
- "insertText": "# syntax=docker/dockerfile:1\nFROM mcr.microsoft.com/dotnet/sdk:${1:8.0} AS builder\nWORKDIR /app\nCOPY *.csproj .\nRUN dotnet restore\nCOPY . .\nRUN dotnet publish -c Release -o /out --no-restore\n\nFROM mcr.microsoft.com/dotnet/aspnet:${1:8.0}\nWORKDIR /app\nRUN groupadd -r appuser && useradd -r -g appuser appuser\nCOPY --from=builder /out .\nUSER appuser\nEXPOSE ${2:8080}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD curl -f http://localhost:${2:8080}/health || exit 1\nENTRYPOINT [\"dotnet\", \"${3:MyApp}.dll\"]",
984
- "insertTextRules": 4,
985
- "sortText": "20_tmpl_dotnet"
986
- },
987
- {
988
- "label": "Dockerfile: Nginx static site",
989
- "kind": 15,
990
- "detail": "Nginx static site Dockerfile",
991
- "documentation": {
992
- "value": "Serve static files with Nginx using a multi-stage build."
993
- },
994
- "insertText": "# syntax=docker/dockerfile:1\nFROM node:${1:20}-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM nginx:${2:alpine}\nCOPY --from=builder /app/${3:dist} /usr/share/nginx/html\nCOPY ${4:nginx.conf} /etc/nginx/conf.d/default.conf\nEXPOSE 80\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD curl -f http://localhost/ || exit 1\nCMD [\"nginx\", \"-g\", \"daemon off;\"]",
995
- "insertTextRules": 4,
996
- "sortText": "20_tmpl_nginx"
997
- },
998
- {
999
- "label": "Dockerfile: PHP-FPM",
1000
- "kind": 15,
1001
- "detail": "PHP-FPM Dockerfile",
1002
- "documentation": {
1003
- "value": "PHP-FPM application Dockerfile with Composer."
1004
- },
1005
- "insertText": "# syntax=docker/dockerfile:1\nFROM composer:${1:2} AS vendor\nWORKDIR /app\nCOPY composer.json composer.lock ./\nRUN composer install --no-dev --no-scripts --no-autoloader\nCOPY . .\nRUN composer dump-autoload --optimize\n\nFROM php:${2:8.3}-fpm-alpine\nWORKDIR /var/www/html\nRUN docker-php-ext-install pdo pdo_mysql opcache\nCOPY --from=vendor /app .\nRUN chown -R www-data:www-data /var/www/html\nUSER www-data\nEXPOSE 9000\nCMD [\"php-fpm\"]",
1006
- "insertTextRules": 4,
1007
- "sortText": "20_tmpl_php"
1008
- },
1009
- {
1010
- "label": "Dockerfile: Ruby/Rails",
1011
- "kind": 15,
1012
- "detail": "Ruby/Rails Dockerfile",
1013
- "documentation": {
1014
- "value": "Production-ready Dockerfile for a Ruby on Rails application."
1015
- },
1016
- "insertText": "# syntax=docker/dockerfile:1\nFROM ruby:${1:3.3}-slim AS builder\nWORKDIR /app\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n build-essential libpq-dev \\\n && rm -rf /var/lib/apt/lists/*\nCOPY Gemfile Gemfile.lock ./\nRUN bundle config set --local deployment true \\\n && bundle config set --local without \"development test\" \\\n && bundle install\n\nFROM ruby:${1:3.3}-slim\nWORKDIR /app\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n libpq5 \\\n && rm -rf /var/lib/apt/lists/*\nRUN groupadd -r rails && useradd -r -g rails rails\nCOPY --from=builder /app/vendor/bundle ./vendor/bundle\nCOPY . .\nRUN bundle config set --local path vendor/bundle\nUSER rails\nEXPOSE ${2:3000}\nCMD [\"bundle\", \"exec\", \"rails\", \"server\", \"-b\", \"0.0.0.0\"]",
1017
- "insertTextRules": 4,
1018
- "sortText": "20_tmpl_ruby"
1019
- },
1020
- {
1021
- "label": "Non-root user setup",
1022
- "kind": 15,
1023
- "detail": "Non-root user pattern",
1024
- "documentation": {
1025
- "value": "Best practice: create and switch to a non-root user."
1026
- },
1027
- "insertText": "RUN groupadd -r ${1:appuser} && useradd -r -g ${1:appuser} -d /home/${1:appuser} -s /sbin/nologin ${1:appuser} \\\n && mkdir -p /home/${1:appuser} && chown -R ${1:appuser}:${1:appuser} /home/${1:appuser}\nUSER ${1:appuser}",
1028
- "insertTextRules": 4,
1029
- "sortText": "18_bp_nonroot"
1030
- },
1031
- {
1032
- "label": "apt-get best practice",
1033
- "kind": 15,
1034
- "detail": "apt-get best practice layer",
1035
- "documentation": {
1036
- "value": "Install packages and clean up in a single layer."
1037
- },
1038
- "insertText": "RUN apt-get update \\\n && apt-get install -y --no-install-recommends \\\n ${1:curl} \\\n ${2:ca-certificates} \\\n && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \\\n && rm -rf /var/lib/apt/lists/*",
1039
- "insertTextRules": 4,
1040
- "sortText": "18_bp_apt"
1041
- },
1042
- {
1043
- "label": "pip best practice",
1044
- "kind": 15,
1045
- "detail": "pip install best practice",
1046
- "documentation": {
1047
- "value": "Install Python packages without cache."
1048
- },
1049
- "insertText": "COPY requirements.txt .\nRUN pip install --no-cache-dir --upgrade pip \\\n && pip install --no-cache-dir -r requirements.txt",
1050
- "insertTextRules": 4,
1051
- "sortText": "18_bp_pip"
1052
- },
1053
- {
1054
- "label": "npm ci pattern",
1055
- "kind": 15,
1056
- "detail": "npm ci production pattern",
1057
- "documentation": {
1058
- "value": "Install production Node.js dependencies."
1059
- },
1060
- "insertText": "COPY package.json package-lock.json ./\nRUN npm ci --only=production \\\n && npm cache clean --force",
1061
- "insertTextRules": 4,
1062
- "sortText": "18_bp_npm"
1063
- },
1064
- {
1065
- "label": "Multi-stage build pattern",
1066
- "kind": 15,
1067
- "detail": "Multi-stage build skeleton",
1068
- "documentation": {
1069
- "value": "Basic multi-stage build skeleton."
1070
- },
1071
- "insertText": "FROM ${1:node:20-alpine} AS builder\nWORKDIR /app\nCOPY . .\nRUN ${2:npm ci && npm run build}\n\nFROM ${3:node:20-alpine}\nWORKDIR /app\nCOPY --from=builder /app/${4:dist} ./${4:dist}\nEXPOSE ${5:3000}\nCMD ${6:[\"node\", \"dist/index.js\"]}",
1072
- "insertTextRules": 4,
1073
- "sortText": "18_bp_multistage"
1074
- },
1075
- {
1076
- "label": "Distroless final stage",
1077
- "kind": 15,
1078
- "detail": "Distroless final stage",
1079
- "documentation": {
1080
- "value": "Use Google distroless as the final minimal image."
1081
- },
1082
- "insertText": "FROM gcr.io/distroless/${1|static-debian12,base-debian12,cc-debian12,java21-debian12,python3-debian12,nodejs22-debian12|}\nCOPY --from=builder ${2:/app/binary} ${3:/}\nUSER nonroot:nonroot\nENTRYPOINT [\"${4:/binary}\"]",
1083
- "insertTextRules": 4,
1084
- "sortText": "18_bp_distroless"
1085
- },
1086
- {
1087
- "label": "Signal handling (tini)",
1088
- "kind": 15,
1089
- "detail": "Signal handling with tini",
1090
- "documentation": {
1091
- "value": "Use tini init for proper PID 1 signal handling."
1092
- },
1093
- "insertText": "RUN apt-get update && apt-get install -y --no-install-recommends tini \\\n && rm -rf /var/lib/apt/lists/*\nENTRYPOINT [\"tini\", \"--\"]\nCMD [\"${1:node}\", \"${2:server.js}\"]",
1094
- "insertTextRules": 4,
1095
- "sortText": "18_bp_tini"
1096
- },
1097
- {
1098
- "label": "Build cache optimization",
1099
- "kind": 15,
1100
- "detail": "Layer caching order",
1101
- "documentation": {
1102
- "value": "Copy dependency files before source for cache optimization."
1103
- },
1104
- "insertText": "# Copy dependency manifests first (changes less often)\nCOPY ${1:package.json} ${2:package-lock.json} ./\nRUN ${3:npm ci}\n\n# Copy source code (changes more often)\nCOPY . .\nRUN ${4:npm run build}",
1105
- "insertTextRules": 4,
1106
- "sortText": "18_bp_cache_order"
1107
- },
1108
- {
1109
- "label": "FROM alpine",
1110
- "kind": 15,
1111
- "detail": "Alpine Linux",
1112
- "documentation": {
1113
- "value": "Minimal 5MB Alpine Linux base image."
1114
- },
1115
- "insertText": "FROM alpine:${1:3.19}",
1116
- "insertTextRules": 4,
1117
- "sortText": "19_base_alpine"
1118
- },
1119
- {
1120
- "label": "FROM node:alpine",
1121
- "kind": 15,
1122
- "detail": "Node.js Alpine",
1123
- "documentation": {
1124
- "value": "Node.js on Alpine Linux."
1125
- },
1126
- "insertText": "FROM node:${1:20}-alpine",
1127
- "insertTextRules": 4,
1128
- "sortText": "19_base_node_alpine"
1129
- },
1130
- {
1131
- "label": "FROM node:slim",
1132
- "kind": 15,
1133
- "detail": "Node.js Slim",
1134
- "documentation": {
1135
- "value": "Node.js on Debian slim."
1136
- },
1137
- "insertText": "FROM node:${1:20}-slim",
1138
- "insertTextRules": 4,
1139
- "sortText": "19_base_node_slim"
1140
- },
1141
- {
1142
- "label": "FROM python:slim",
1143
- "kind": 15,
1144
- "detail": "Python Slim",
1145
- "documentation": {
1146
- "value": "Python on Debian slim."
1147
- },
1148
- "insertText": "FROM python:${1:3.12}-slim",
1149
- "insertTextRules": 4,
1150
- "sortText": "19_base_python_slim"
1151
- },
1152
- {
1153
- "label": "FROM python:alpine",
1154
- "kind": 15,
1155
- "detail": "Python Alpine",
1156
- "documentation": {
1157
- "value": "Python on Alpine Linux."
1158
- },
1159
- "insertText": "FROM python:${1:3.12}-alpine",
1160
- "insertTextRules": 4,
1161
- "sortText": "19_base_python_alpine"
1162
- },
1163
- {
1164
- "label": "FROM golang:alpine",
1165
- "kind": 15,
1166
- "detail": "Go Alpine",
1167
- "documentation": {
1168
- "value": "Go on Alpine Linux."
1169
- },
1170
- "insertText": "FROM golang:${1:1.22}-alpine",
1171
- "insertTextRules": 4,
1172
- "sortText": "19_base_golang_alpine"
1173
- },
1174
- {
1175
- "label": "FROM ubuntu",
1176
- "kind": 15,
1177
- "detail": "Ubuntu",
1178
- "documentation": {
1179
- "value": "Ubuntu base image."
1180
- },
1181
- "insertText": "FROM ubuntu:${1:24.04}",
1182
- "insertTextRules": 4,
1183
- "sortText": "19_base_ubuntu"
1184
- },
1185
- {
1186
- "label": "FROM debian:slim",
1187
- "kind": 15,
1188
- "detail": "Debian Slim",
1189
- "documentation": {
1190
- "value": "Minimal Debian base image."
1191
- },
1192
- "insertText": "FROM debian:${1:bookworm}-slim",
1193
- "insertTextRules": 4,
1194
- "sortText": "19_base_debian_slim"
1195
- },
1196
- {
1197
- "label": "FROM nginx:alpine",
1198
- "kind": 15,
1199
- "detail": "Nginx Alpine",
1200
- "documentation": {
1201
- "value": "Nginx on Alpine Linux."
1202
- },
1203
- "insertText": "FROM nginx:${1:alpine}",
1204
- "insertTextRules": 4,
1205
- "sortText": "19_base_nginx_alpine"
1206
- },
1207
- {
1208
- "label": "FROM distroless",
1209
- "kind": 15,
1210
- "detail": "Distroless static",
1211
- "documentation": {
1212
- "value": "Google distroless static image (no shell)."
1213
- },
1214
- "insertText": "FROM gcr.io/distroless/static-debian12",
1215
- "insertTextRules": 4,
1216
- "sortText": "19_base_distroless"
1217
- },
1218
- {
1219
- "label": "FROM scratch",
1220
- "kind": 15,
1221
- "detail": "Scratch (empty)",
1222
- "documentation": {
1223
- "value": "Empty base image for static binaries."
1224
- },
1225
- "insertText": "FROM scratch",
1226
- "insertTextRules": 4,
1227
- "sortText": "19_base_scratch"
1228
- },
1229
- {
1230
- "label": "COPY --parents",
1231
- "kind": 15,
1232
- "detail": "Copy preserving directory structure",
1233
- "documentation": {
1234
- "value": "Copy files preserving parent directory structure (BuildKit).\n\n```dockerfile\nCOPY --parents src/app/config.json /app/\n# Creates /app/src/app/config.json\n```"
1235
- },
1236
- "insertText": "COPY --parents ${1:src/dir/} ${2:/dest/}",
1237
- "insertTextRules": 4,
1238
- "sortText": "02_copy_parents"
1239
- },
1240
- {
1241
- "label": "ADD --keep-git-dir",
1242
- "kind": 15,
1243
- "detail": "Add Git repo keeping .git",
1244
- "documentation": {
1245
- "value": "Clone and keep the .git directory (BuildKit).\n\n```dockerfile\nADD --keep-git-dir=true https://github.com/user/repo.git /src\n```"
1246
- },
1247
- "insertText": "ADD --keep-git-dir=true ${1:https://github.com/user/repo.git} ${2:/src}",
1248
- "insertTextRules": 4,
1249
- "sortText": "02_add_gitdir"
1250
- },
1251
- {
1252
- "label": ".dockerignore pattern",
1253
- "kind": 15,
1254
- "detail": ".dockerignore best practice",
1255
- "documentation": {
1256
- "value": "Recommended .dockerignore contents to reduce build context.\n\n```\n# .dockerignore\nnode_modules\n.git\n.env\n*.md\nDockerfile*\ndocker-compose*\n.dockerignore\n.vscode\n__pycache__\n*.pyc\n.tox\n.coverage\ndist\nbuild\n```"
1257
- },
1258
- "insertText": "# .dockerignore\nnode_modules\n.git\n.env\n*.md\nDockerfile*\ndocker-compose*\n.dockerignore\n${1:.vscode}",
1259
- "insertTextRules": 4,
1260
- "sortText": "09_dockerignore"
1261
- },
1262
- {
1263
- "label": "COPY heredoc",
1264
- "kind": 15,
1265
- "detail": "Inline file creation with heredoc",
1266
- "documentation": {
1267
- "value": "Create files inline using heredoc syntax (BuildKit).\n\n```dockerfile\nCOPY <<EOF /app/config.json\n{\"key\": \"value\"}\nEOF\n```"
1268
- },
1269
- "insertText": "COPY <<EOF ${1:/app/config.json}\n${2:content}\nEOF",
1270
- "insertTextRules": 4,
1271
- "sortText": "02_copy_heredoc"
1272
- },
1273
- {
1274
- "label": "RUN pipe pattern",
1275
- "kind": 15,
1276
- "detail": "RUN with pipe and set -o pipefail",
1277
- "documentation": {
1278
- "value": "Use pipefail for reliable pipe error detection.\n\n```dockerfile\nRUN set -o pipefail && curl -fsSL https://example.com/install.sh | bash\n```"
1279
- },
1280
- "insertText": "RUN set -o pipefail && ${1:curl -fsSL https://example.com/install.sh} | ${2:bash}",
1281
- "insertTextRules": 4,
1282
- "sortText": "01_run_pipe"
1283
- }
1284
- ]
1285
- }
1
+ {
2
+ "language": "dockerfile",
3
+ "completions": [
4
+ {
5
+ "label": "FROM",
6
+ "kind": 14,
7
+ "detail": "Base image instruction",
8
+ "documentation": {
9
+ "value": "Set the base image for subsequent instructions. Every Dockerfile must start with FROM (except ARG before FROM)."
10
+ },
11
+ "insertText": "FROM",
12
+ "sortText": "00_from",
13
+ "insertTextRules": 0
14
+ },
15
+ {
16
+ "label": "RUN",
17
+ "kind": 14,
18
+ "detail": "Execute command",
19
+ "documentation": {
20
+ "value": "Execute a command in a new layer on top of the current image and commit the result."
21
+ },
22
+ "insertText": "RUN",
23
+ "sortText": "00_run",
24
+ "insertTextRules": 0
25
+ },
26
+ {
27
+ "label": "CMD",
28
+ "kind": 14,
29
+ "detail": "Default command",
30
+ "documentation": {
31
+ "value": "Provide defaults for an executing container. Only one CMD per Dockerfile; the last one wins."
32
+ },
33
+ "insertText": "CMD",
34
+ "sortText": "00_cmd",
35
+ "insertTextRules": 0
36
+ },
37
+ {
38
+ "label": "LABEL",
39
+ "kind": 14,
40
+ "detail": "Metadata label",
41
+ "documentation": {
42
+ "value": "Add metadata key-value pairs to the image."
43
+ },
44
+ "insertText": "LABEL",
45
+ "sortText": "00_label",
46
+ "insertTextRules": 0
47
+ },
48
+ {
49
+ "label": "MAINTAINER",
50
+ "kind": 14,
51
+ "detail": "Author (deprecated)",
52
+ "documentation": {
53
+ "value": "Set the Author field of the generated image. Deprecated in favor of LABEL."
54
+ },
55
+ "insertText": "MAINTAINER",
56
+ "sortText": "00_maintainer",
57
+ "insertTextRules": 0
58
+ },
59
+ {
60
+ "label": "EXPOSE",
61
+ "kind": 14,
62
+ "detail": "Expose port",
63
+ "documentation": {
64
+ "value": "Inform Docker that the container listens on the specified network ports at runtime."
65
+ },
66
+ "insertText": "EXPOSE",
67
+ "sortText": "00_expose",
68
+ "insertTextRules": 0
69
+ },
70
+ {
71
+ "label": "ENV",
72
+ "kind": 14,
73
+ "detail": "Environment variable",
74
+ "documentation": {
75
+ "value": "Set an environment variable that persists in the built image and running containers."
76
+ },
77
+ "insertText": "ENV",
78
+ "sortText": "00_env",
79
+ "insertTextRules": 0
80
+ },
81
+ {
82
+ "label": "ADD",
83
+ "kind": 14,
84
+ "detail": "Add files",
85
+ "documentation": {
86
+ "value": "Copy files, directories, or remote URLs into the image filesystem. Automatically extracts tar archives."
87
+ },
88
+ "insertText": "ADD",
89
+ "sortText": "00_add",
90
+ "insertTextRules": 0
91
+ },
92
+ {
93
+ "label": "COPY",
94
+ "kind": 14,
95
+ "detail": "Copy files",
96
+ "documentation": {
97
+ "value": "Copy files or directories from the build context into the image filesystem."
98
+ },
99
+ "insertText": "COPY",
100
+ "sortText": "00_copy",
101
+ "insertTextRules": 0
102
+ },
103
+ {
104
+ "label": "ENTRYPOINT",
105
+ "kind": 14,
106
+ "detail": "Container entrypoint",
107
+ "documentation": {
108
+ "value": "Configure a container that will run as an executable."
109
+ },
110
+ "insertText": "ENTRYPOINT",
111
+ "sortText": "00_entrypoint",
112
+ "insertTextRules": 0
113
+ },
114
+ {
115
+ "label": "VOLUME",
116
+ "kind": 14,
117
+ "detail": "Create mount point",
118
+ "documentation": {
119
+ "value": "Create a mount point with the specified name and mark it as holding externally mounted volumes."
120
+ },
121
+ "insertText": "VOLUME",
122
+ "sortText": "00_volume",
123
+ "insertTextRules": 0
124
+ },
125
+ {
126
+ "label": "USER",
127
+ "kind": 14,
128
+ "detail": "Set user",
129
+ "documentation": {
130
+ "value": "Set the user name or UID (and optionally group) to use for RUN, CMD, and ENTRYPOINT instructions."
131
+ },
132
+ "insertText": "USER",
133
+ "sortText": "00_user",
134
+ "insertTextRules": 0
135
+ },
136
+ {
137
+ "label": "WORKDIR",
138
+ "kind": 14,
139
+ "detail": "Set working directory",
140
+ "documentation": {
141
+ "value": "Set the working directory for RUN, CMD, ENTRYPOINT, COPY, and ADD instructions."
142
+ },
143
+ "insertText": "WORKDIR",
144
+ "sortText": "00_workdir",
145
+ "insertTextRules": 0
146
+ },
147
+ {
148
+ "label": "ARG",
149
+ "kind": 14,
150
+ "detail": "Build argument",
151
+ "documentation": {
152
+ "value": "Define a build-time variable that users can pass with --build-arg."
153
+ },
154
+ "insertText": "ARG",
155
+ "sortText": "00_arg",
156
+ "insertTextRules": 0
157
+ },
158
+ {
159
+ "label": "ONBUILD",
160
+ "kind": 14,
161
+ "detail": "Deferred instruction",
162
+ "documentation": {
163
+ "value": "Add a trigger instruction that executes when the image is used as a base for another build."
164
+ },
165
+ "insertText": "ONBUILD",
166
+ "sortText": "00_onbuild",
167
+ "insertTextRules": 0
168
+ },
169
+ {
170
+ "label": "STOPSIGNAL",
171
+ "kind": 14,
172
+ "detail": "Stop signal",
173
+ "documentation": {
174
+ "value": "Set the system call signal that will be sent to the container to exit."
175
+ },
176
+ "insertText": "STOPSIGNAL",
177
+ "sortText": "00_stopsignal",
178
+ "insertTextRules": 0
179
+ },
180
+ {
181
+ "label": "HEALTHCHECK",
182
+ "kind": 14,
183
+ "detail": "Health check",
184
+ "documentation": {
185
+ "value": "Tell Docker how to test a container to check that it is still working."
186
+ },
187
+ "insertText": "HEALTHCHECK",
188
+ "sortText": "00_healthcheck",
189
+ "insertTextRules": 0
190
+ },
191
+ {
192
+ "label": "SHELL",
193
+ "kind": 14,
194
+ "detail": "Default shell",
195
+ "documentation": {
196
+ "value": "Override the default shell used for the shell form of commands."
197
+ },
198
+ "insertText": "SHELL",
199
+ "sortText": "00_shell",
200
+ "insertTextRules": 0
201
+ },
202
+ {
203
+ "label": "FROM image",
204
+ "kind": 15,
205
+ "detail": "FROM with image",
206
+ "documentation": {
207
+ "value": "Basic FROM with image name."
208
+ },
209
+ "insertText": "FROM ${1:image}",
210
+ "insertTextRules": 4,
211
+ "sortText": "01_from_basic"
212
+ },
213
+ {
214
+ "label": "FROM image:tag",
215
+ "kind": 15,
216
+ "detail": "FROM with tag",
217
+ "documentation": {
218
+ "value": "FROM with explicit image tag."
219
+ },
220
+ "insertText": "FROM ${1:image}:${2:tag}",
221
+ "insertTextRules": 4,
222
+ "sortText": "01_from_tag"
223
+ },
224
+ {
225
+ "label": "FROM image AS stage",
226
+ "kind": 15,
227
+ "detail": "FROM multi-stage",
228
+ "documentation": {
229
+ "value": "FROM with AS alias for multi-stage builds."
230
+ },
231
+ "insertText": "FROM ${1:image}:${2:tag} AS ${3:builder}",
232
+ "insertTextRules": 4,
233
+ "sortText": "01_from_as"
234
+ },
235
+ {
236
+ "label": "FROM --platform",
237
+ "kind": 15,
238
+ "detail": "FROM with platform",
239
+ "documentation": {
240
+ "value": "FROM with explicit platform for cross-compilation."
241
+ },
242
+ "insertText": "FROM --platform=${1|linux/amd64,linux/arm64,linux/arm/v7,\\$BUILDPLATFORM,\\$TARGETPLATFORM|} ${2:image}:${3:tag}",
243
+ "insertTextRules": 4,
244
+ "sortText": "01_from_platform"
245
+ },
246
+ {
247
+ "label": "FROM --platform AS",
248
+ "kind": 15,
249
+ "detail": "FROM platform + stage",
250
+ "documentation": {
251
+ "value": "FROM with platform and stage alias."
252
+ },
253
+ "insertText": "FROM --platform=${1|linux/amd64,linux/arm64,\\$BUILDPLATFORM,\\$TARGETPLATFORM|} ${2:image}:${3:tag} AS ${4:stage}",
254
+ "insertTextRules": 4,
255
+ "sortText": "01_from_platform_as"
256
+ },
257
+ {
258
+ "label": "FROM scratch",
259
+ "kind": 15,
260
+ "detail": "FROM scratch (empty)",
261
+ "documentation": {
262
+ "value": "Start from an empty image, used for statically linked binaries."
263
+ },
264
+ "insertText": "FROM scratch",
265
+ "insertTextRules": 4,
266
+ "sortText": "01_from_scratch"
267
+ },
268
+ {
269
+ "label": "RUN shell",
270
+ "kind": 15,
271
+ "detail": "RUN shell form",
272
+ "documentation": {
273
+ "value": "Execute command in shell form (/bin/sh -c)."
274
+ },
275
+ "insertText": "RUN ${1:command}",
276
+ "insertTextRules": 4,
277
+ "sortText": "02_run_shell"
278
+ },
279
+ {
280
+ "label": "RUN exec",
281
+ "kind": 15,
282
+ "detail": "RUN exec form",
283
+ "documentation": {
284
+ "value": "Execute command in exec form (no shell processing)."
285
+ },
286
+ "insertText": "RUN [\"${1:executable}\", \"${2:arg1}\", \"${3:arg2}\"]",
287
+ "insertTextRules": 4,
288
+ "sortText": "02_run_exec"
289
+ },
290
+ {
291
+ "label": "RUN --mount=cache",
292
+ "kind": 15,
293
+ "detail": "RUN with cache mount",
294
+ "documentation": {
295
+ "value": "Mount a persistent cache directory for package managers."
296
+ },
297
+ "insertText": "RUN --mount=type=cache,target=${1:/var/cache/apt} \\\n ${2:apt-get update && apt-get install -y package}",
298
+ "insertTextRules": 4,
299
+ "sortText": "02_run_mount_cache"
300
+ },
301
+ {
302
+ "label": "RUN --mount=bind",
303
+ "kind": 15,
304
+ "detail": "RUN with bind mount",
305
+ "documentation": {
306
+ "value": "Bind mount a directory from the build context."
307
+ },
308
+ "insertText": "RUN --mount=type=bind,source=${1:src},target=${2:/app/src} \\\n ${3:command}",
309
+ "insertTextRules": 4,
310
+ "sortText": "02_run_mount_bind"
311
+ },
312
+ {
313
+ "label": "RUN --mount=secret",
314
+ "kind": 15,
315
+ "detail": "RUN with secret mount",
316
+ "documentation": {
317
+ "value": "Mount a secret file without persisting in the image layer."
318
+ },
319
+ "insertText": "RUN --mount=type=secret,id=${1:mysecret},target=${2:/run/secrets/mysecret} \\\n ${3:cat /run/secrets/mysecret}",
320
+ "insertTextRules": 4,
321
+ "sortText": "02_run_mount_secret"
322
+ },
323
+ {
324
+ "label": "RUN --mount=ssh",
325
+ "kind": 15,
326
+ "detail": "RUN with SSH mount",
327
+ "documentation": {
328
+ "value": "Forward SSH agent for private repo access during build."
329
+ },
330
+ "insertText": "RUN --mount=type=ssh \\\n ${1:git clone git@github.com:user/repo.git}",
331
+ "insertTextRules": 4,
332
+ "sortText": "02_run_mount_ssh"
333
+ },
334
+ {
335
+ "label": "RUN --mount=tmpfs",
336
+ "kind": 15,
337
+ "detail": "RUN with tmpfs mount",
338
+ "documentation": {
339
+ "value": "Mount a tmpfs for temporary scratch space."
340
+ },
341
+ "insertText": "RUN --mount=type=tmpfs,target=${1:/tmp} \\\n ${2:command}",
342
+ "insertTextRules": 4,
343
+ "sortText": "02_run_mount_tmpfs"
344
+ },
345
+ {
346
+ "label": "RUN heredoc",
347
+ "kind": 15,
348
+ "detail": "RUN with heredoc",
349
+ "documentation": {
350
+ "value": "Run multi-line script using heredoc syntax (BuildKit)."
351
+ },
352
+ "insertText": "RUN <<EOF\n${1:#!/bin/bash\nset -e\necho \"hello\"}\nEOF",
353
+ "insertTextRules": 4,
354
+ "sortText": "02_run_heredoc"
355
+ },
356
+ {
357
+ "label": "RUN apt-get install",
358
+ "kind": 15,
359
+ "detail": "RUN apt-get best practice",
360
+ "documentation": {
361
+ "value": "Best practice apt-get install: update + install + clean in one layer."
362
+ },
363
+ "insertText": "RUN apt-get update && apt-get install -y --no-install-recommends \\\n ${1:package1} \\\n ${2:package2} \\\n && rm -rf /var/lib/apt/lists/*",
364
+ "insertTextRules": 4,
365
+ "sortText": "02_run_apt"
366
+ },
367
+ {
368
+ "label": "RUN pip install",
369
+ "kind": 15,
370
+ "detail": "RUN pip install",
371
+ "documentation": {
372
+ "value": "Install Python packages with no cache for smaller images."
373
+ },
374
+ "insertText": "RUN pip install --no-cache-dir ${1:-r requirements.txt}",
375
+ "insertTextRules": 4,
376
+ "sortText": "02_run_pip"
377
+ },
378
+ {
379
+ "label": "RUN npm ci",
380
+ "kind": 15,
381
+ "detail": "RUN npm ci",
382
+ "documentation": {
383
+ "value": "Install Node.js dependencies for reproducible builds."
384
+ },
385
+ "insertText": "RUN npm ci --only=production",
386
+ "insertTextRules": 4,
387
+ "sortText": "02_run_npm_ci"
388
+ },
389
+ {
390
+ "label": "RUN apk add",
391
+ "kind": 15,
392
+ "detail": "RUN apk add (Alpine)",
393
+ "documentation": {
394
+ "value": "Install packages on Alpine Linux."
395
+ },
396
+ "insertText": "RUN apk add --no-cache \\\n ${1:package1} \\\n ${2:package2}",
397
+ "insertTextRules": 4,
398
+ "sortText": "02_run_apk"
399
+ },
400
+ {
401
+ "label": "RUN --network=none",
402
+ "kind": 15,
403
+ "detail": "RUN without network",
404
+ "documentation": {
405
+ "value": "Run command with network disabled for security."
406
+ },
407
+ "insertText": "RUN --network=none ${1:command}",
408
+ "insertTextRules": 4,
409
+ "sortText": "02_run_network_none"
410
+ },
411
+ {
412
+ "label": "RUN --security=insecure",
413
+ "kind": 15,
414
+ "detail": "RUN insecure (privileged)",
415
+ "documentation": {
416
+ "value": "Run with elevated privileges (requires security.insecure entitlement)."
417
+ },
418
+ "insertText": "RUN --security=insecure ${1:command}",
419
+ "insertTextRules": 4,
420
+ "sortText": "02_run_security"
421
+ },
422
+ {
423
+ "label": "RUN useradd",
424
+ "kind": 15,
425
+ "detail": "RUN create user",
426
+ "documentation": {
427
+ "value": "Create a non-root user for running the application."
428
+ },
429
+ "insertText": "RUN groupadd -r ${1:appuser} && useradd -r -g ${1:appuser} -d /home/${1:appuser} -s /sbin/nologin ${1:appuser}",
430
+ "insertTextRules": 4,
431
+ "sortText": "02_run_useradd"
432
+ },
433
+ {
434
+ "label": "RUN adduser Alpine",
435
+ "kind": 15,
436
+ "detail": "RUN create user (Alpine)",
437
+ "documentation": {
438
+ "value": "Create a non-root user on Alpine."
439
+ },
440
+ "insertText": "RUN addgroup -S ${1:appuser} && adduser -S ${1:appuser} -G ${1:appuser}",
441
+ "insertTextRules": 4,
442
+ "sortText": "02_run_adduser_alpine"
443
+ },
444
+ {
445
+ "label": "CMD exec form",
446
+ "kind": 15,
447
+ "detail": "CMD exec form",
448
+ "documentation": {
449
+ "value": "Set default command in exec form (preferred)."
450
+ },
451
+ "insertText": "CMD [\"${1:executable}\", \"${2:arg1}\"]",
452
+ "insertTextRules": 4,
453
+ "sortText": "03_cmd_exec"
454
+ },
455
+ {
456
+ "label": "CMD shell form",
457
+ "kind": 15,
458
+ "detail": "CMD shell form",
459
+ "documentation": {
460
+ "value": "Set default command in shell form."
461
+ },
462
+ "insertText": "CMD ${1:command arg1 arg2}",
463
+ "insertTextRules": 4,
464
+ "sortText": "03_cmd_shell"
465
+ },
466
+ {
467
+ "label": "CMD as ENTRYPOINT params",
468
+ "kind": 15,
469
+ "detail": "CMD default parameters",
470
+ "documentation": {
471
+ "value": "Provide default parameters to ENTRYPOINT."
472
+ },
473
+ "insertText": "CMD [\"${1:--help}\"]",
474
+ "insertTextRules": 4,
475
+ "sortText": "03_cmd_params"
476
+ },
477
+ {
478
+ "label": "ENTRYPOINT exec form",
479
+ "kind": 15,
480
+ "detail": "ENTRYPOINT exec form",
481
+ "documentation": {
482
+ "value": "Set entrypoint in exec form (preferred)."
483
+ },
484
+ "insertText": "ENTRYPOINT [\"${1:executable}\", \"${2:arg1}\"]",
485
+ "insertTextRules": 4,
486
+ "sortText": "04_entrypoint_exec"
487
+ },
488
+ {
489
+ "label": "ENTRYPOINT shell form",
490
+ "kind": 15,
491
+ "detail": "ENTRYPOINT shell form",
492
+ "documentation": {
493
+ "value": "Set entrypoint in shell form."
494
+ },
495
+ "insertText": "ENTRYPOINT ${1:command arg1}",
496
+ "insertTextRules": 4,
497
+ "sortText": "04_entrypoint_shell"
498
+ },
499
+ {
500
+ "label": "ENTRYPOINT with tini",
501
+ "kind": 15,
502
+ "detail": "ENTRYPOINT with tini",
503
+ "documentation": {
504
+ "value": "Use tini as PID 1 for proper signal handling."
505
+ },
506
+ "insertText": "ENTRYPOINT [\"tini\", \"--\", \"${1:executable}\"]",
507
+ "insertTextRules": 4,
508
+ "sortText": "04_entrypoint_tini"
509
+ },
510
+ {
511
+ "label": "ENTRYPOINT with dumb-init",
512
+ "kind": 15,
513
+ "detail": "ENTRYPOINT with dumb-init",
514
+ "documentation": {
515
+ "value": "Use dumb-init as PID 1 for signal forwarding."
516
+ },
517
+ "insertText": "ENTRYPOINT [\"dumb-init\", \"--\", \"${1:executable}\"]",
518
+ "insertTextRules": 4,
519
+ "sortText": "04_entrypoint_dumb_init"
520
+ },
521
+ {
522
+ "label": "COPY basic",
523
+ "kind": 15,
524
+ "detail": "COPY files",
525
+ "documentation": {
526
+ "value": "Copy files from build context into the image."
527
+ },
528
+ "insertText": "COPY ${1:src} ${2:dest}",
529
+ "insertTextRules": 4,
530
+ "sortText": "05_copy_basic"
531
+ },
532
+ {
533
+ "label": "COPY --chown",
534
+ "kind": 15,
535
+ "detail": "COPY with chown",
536
+ "documentation": {
537
+ "value": "Copy files and set ownership."
538
+ },
539
+ "insertText": "COPY --chown=${1:user}:${2:group} ${3:src} ${4:dest}",
540
+ "insertTextRules": 4,
541
+ "sortText": "05_copy_chown"
542
+ },
543
+ {
544
+ "label": "COPY --chmod",
545
+ "kind": 15,
546
+ "detail": "COPY with chmod",
547
+ "documentation": {
548
+ "value": "Copy files and set permissions (BuildKit)."
549
+ },
550
+ "insertText": "COPY --chmod=${1:755} ${2:src} ${3:dest}",
551
+ "insertTextRules": 4,
552
+ "sortText": "05_copy_chmod"
553
+ },
554
+ {
555
+ "label": "COPY --from",
556
+ "kind": 15,
557
+ "detail": "COPY from stage",
558
+ "documentation": {
559
+ "value": "Copy files from a named build stage (multi-stage)."
560
+ },
561
+ "insertText": "COPY --from=${1:builder} ${2:/app/build} ${3:/usr/share/nginx/html}",
562
+ "insertTextRules": 4,
563
+ "sortText": "05_copy_from"
564
+ },
565
+ {
566
+ "label": "COPY --link",
567
+ "kind": 15,
568
+ "detail": "COPY with link",
569
+ "documentation": {
570
+ "value": "Copy files using link mode for better cache efficiency."
571
+ },
572
+ "insertText": "COPY --link ${1:src} ${2:dest}",
573
+ "insertTextRules": 4,
574
+ "sortText": "05_copy_link"
575
+ },
576
+ {
577
+ "label": "COPY package*.json",
578
+ "kind": 15,
579
+ "detail": "COPY package files first",
580
+ "documentation": {
581
+ "value": "Copy only package files first for better layer caching."
582
+ },
583
+ "insertText": "COPY package*.json ${1:./}\nRUN npm ci\nCOPY ${2:.} ${3:./}",
584
+ "insertTextRules": 4,
585
+ "sortText": "05_copy_package_cache"
586
+ },
587
+ {
588
+ "label": "ADD basic",
589
+ "kind": 15,
590
+ "detail": "ADD files",
591
+ "documentation": {
592
+ "value": "Add files from build context (or URL/tar) into the image."
593
+ },
594
+ "insertText": "ADD ${1:src} ${2:dest}",
595
+ "insertTextRules": 4,
596
+ "sortText": "06_add_basic"
597
+ },
598
+ {
599
+ "label": "ADD URL",
600
+ "kind": 15,
601
+ "detail": "ADD from URL",
602
+ "documentation": {
603
+ "value": "Download a file from a URL into the image."
604
+ },
605
+ "insertText": "ADD ${1:https://example.com/file.tar.gz} ${2:/tmp/}",
606
+ "insertTextRules": 4,
607
+ "sortText": "06_add_url"
608
+ },
609
+ {
610
+ "label": "ADD tar",
611
+ "kind": 15,
612
+ "detail": "ADD tar auto-extract",
613
+ "documentation": {
614
+ "value": "Add and auto-extract a tar archive."
615
+ },
616
+ "insertText": "ADD ${1:archive.tar.gz} ${2:/opt/}",
617
+ "insertTextRules": 4,
618
+ "sortText": "06_add_tar"
619
+ },
620
+ {
621
+ "label": "ADD --checksum",
622
+ "kind": 15,
623
+ "detail": "ADD with checksum",
624
+ "documentation": {
625
+ "value": "Add file with SHA256 checksum verification (BuildKit)."
626
+ },
627
+ "insertText": "ADD --checksum=sha256:${1:hash} ${2:https://example.com/file} ${3:/dest}",
628
+ "insertTextRules": 4,
629
+ "sortText": "06_add_checksum"
630
+ },
631
+ {
632
+ "label": "ENV single",
633
+ "kind": 15,
634
+ "detail": "ENV single variable",
635
+ "documentation": {
636
+ "value": "Set a single environment variable."
637
+ },
638
+ "insertText": "ENV ${1:KEY}=${2:value}",
639
+ "insertTextRules": 4,
640
+ "sortText": "07_env_single"
641
+ },
642
+ {
643
+ "label": "ENV multiple",
644
+ "kind": 15,
645
+ "detail": "ENV multiple variables",
646
+ "documentation": {
647
+ "value": "Set multiple environment variables."
648
+ },
649
+ "insertText": "ENV ${1:KEY1}=${2:value1} \\\n ${3:KEY2}=${4:value2}",
650
+ "insertTextRules": 4,
651
+ "sortText": "07_env_multiple"
652
+ },
653
+ {
654
+ "label": "ENV PATH",
655
+ "kind": 15,
656
+ "detail": "ENV prepend PATH",
657
+ "documentation": {
658
+ "value": "Prepend a directory to PATH."
659
+ },
660
+ "insertText": "ENV PATH=\"${1:/app/bin}:$$PATH\"",
661
+ "insertTextRules": 4,
662
+ "sortText": "07_env_path"
663
+ },
664
+ {
665
+ "label": "ENV NODE_ENV",
666
+ "kind": 15,
667
+ "detail": "ENV NODE_ENV production",
668
+ "documentation": {
669
+ "value": "Set Node.js production environment."
670
+ },
671
+ "insertText": "ENV NODE_ENV=production",
672
+ "insertTextRules": 4,
673
+ "sortText": "07_env_node"
674
+ },
675
+ {
676
+ "label": "ENV PYTHONDONTWRITEBYTECODE",
677
+ "kind": 15,
678
+ "detail": "ENV Python optimizations",
679
+ "documentation": {
680
+ "value": "Common Python env vars for Docker."
681
+ },
682
+ "insertText": "ENV PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONUNBUFFERED=1",
683
+ "insertTextRules": 4,
684
+ "sortText": "07_env_python"
685
+ },
686
+ {
687
+ "label": "ARG basic",
688
+ "kind": 15,
689
+ "detail": "ARG variable",
690
+ "documentation": {
691
+ "value": "Define a build-time argument."
692
+ },
693
+ "insertText": "ARG ${1:NAME}",
694
+ "insertTextRules": 4,
695
+ "sortText": "08_arg_basic"
696
+ },
697
+ {
698
+ "label": "ARG with default",
699
+ "kind": 15,
700
+ "detail": "ARG with default value",
701
+ "documentation": {
702
+ "value": "Define a build arg with a default value."
703
+ },
704
+ "insertText": "ARG ${1:NAME}=${2:default}",
705
+ "insertTextRules": 4,
706
+ "sortText": "08_arg_default"
707
+ },
708
+ {
709
+ "label": "ARG before FROM",
710
+ "kind": 15,
711
+ "detail": "ARG before FROM",
712
+ "documentation": {
713
+ "value": "Define ARG before FROM for use in FROM instruction."
714
+ },
715
+ "insertText": "ARG ${1:VERSION}=${2:latest}\nFROM ${3:node}:${1:VERSION}",
716
+ "insertTextRules": 4,
717
+ "sortText": "08_arg_before_from"
718
+ },
719
+ {
720
+ "label": "EXPOSE port",
721
+ "kind": 15,
722
+ "detail": "EXPOSE single port",
723
+ "documentation": {
724
+ "value": "Expose a single port."
725
+ },
726
+ "insertText": "EXPOSE ${1:8080}",
727
+ "insertTextRules": 4,
728
+ "sortText": "09_expose_single"
729
+ },
730
+ {
731
+ "label": "EXPOSE multiple",
732
+ "kind": 15,
733
+ "detail": "EXPOSE multiple ports",
734
+ "documentation": {
735
+ "value": "Expose multiple ports."
736
+ },
737
+ "insertText": "EXPOSE ${1:80} ${2:443}",
738
+ "insertTextRules": 4,
739
+ "sortText": "09_expose_multiple"
740
+ },
741
+ {
742
+ "label": "EXPOSE UDP",
743
+ "kind": 15,
744
+ "detail": "EXPOSE UDP port",
745
+ "documentation": {
746
+ "value": "Expose a UDP port."
747
+ },
748
+ "insertText": "EXPOSE ${1:53}/udp",
749
+ "insertTextRules": 4,
750
+ "sortText": "09_expose_udp"
751
+ },
752
+ {
753
+ "label": "VOLUME path",
754
+ "kind": 15,
755
+ "detail": "VOLUME mount point",
756
+ "documentation": {
757
+ "value": "Create a mount point."
758
+ },
759
+ "insertText": "VOLUME ${1:/data}",
760
+ "insertTextRules": 4,
761
+ "sortText": "10_volume"
762
+ },
763
+ {
764
+ "label": "VOLUME JSON",
765
+ "kind": 15,
766
+ "detail": "VOLUME multiple",
767
+ "documentation": {
768
+ "value": "Create multiple mount points."
769
+ },
770
+ "insertText": "VOLUME [\"${1:/data}\", \"${2:/logs}\"]",
771
+ "insertTextRules": 4,
772
+ "sortText": "10_volume_json"
773
+ },
774
+ {
775
+ "label": "USER name",
776
+ "kind": 15,
777
+ "detail": "USER set user",
778
+ "documentation": {
779
+ "value": "Switch to a non-root user."
780
+ },
781
+ "insertText": "USER ${1:appuser}",
782
+ "insertTextRules": 4,
783
+ "sortText": "11_user"
784
+ },
785
+ {
786
+ "label": "USER uid:gid",
787
+ "kind": 15,
788
+ "detail": "USER with UID:GID",
789
+ "documentation": {
790
+ "value": "Switch to a specific UID:GID."
791
+ },
792
+ "insertText": "USER ${1:1001}:${2:1001}",
793
+ "insertTextRules": 4,
794
+ "sortText": "11_user_uid"
795
+ },
796
+ {
797
+ "label": "WORKDIR path",
798
+ "kind": 15,
799
+ "detail": "WORKDIR set directory",
800
+ "documentation": {
801
+ "value": "Set the working directory."
802
+ },
803
+ "insertText": "WORKDIR ${1:/app}",
804
+ "insertTextRules": 4,
805
+ "sortText": "12_workdir"
806
+ },
807
+ {
808
+ "label": "LABEL single",
809
+ "kind": 15,
810
+ "detail": "LABEL single",
811
+ "documentation": {
812
+ "value": "Add a single metadata label."
813
+ },
814
+ "insertText": "LABEL ${1:key}=\"${2:value}\"",
815
+ "insertTextRules": 4,
816
+ "sortText": "13_label_single"
817
+ },
818
+ {
819
+ "label": "LABEL multiple",
820
+ "kind": 15,
821
+ "detail": "LABEL multiple",
822
+ "documentation": {
823
+ "value": "Add multiple metadata labels."
824
+ },
825
+ "insertText": "LABEL ${1:maintainer}=\"${2:name}\" \\\n ${3:version}=\"${4:1.0}\"",
826
+ "insertTextRules": 4,
827
+ "sortText": "13_label_multiple"
828
+ },
829
+ {
830
+ "label": "LABEL OCI",
831
+ "kind": 15,
832
+ "detail": "LABEL OCI annotations",
833
+ "documentation": {
834
+ "value": "OCI image spec annotation labels."
835
+ },
836
+ "insertText": "LABEL org.opencontainers.image.title=\"${1:title}\" \\\n org.opencontainers.image.description=\"${2:description}\" \\\n org.opencontainers.image.version=\"${3:1.0.0}\" \\\n org.opencontainers.image.authors=\"${4:author}\" \\\n org.opencontainers.image.source=\"${5:https://github.com/user/repo}\" \\\n org.opencontainers.image.licenses=\"${6:MIT}\"",
837
+ "insertTextRules": 4,
838
+ "sortText": "13_label_oci"
839
+ },
840
+ {
841
+ "label": "HEALTHCHECK CMD",
842
+ "kind": 15,
843
+ "detail": "HEALTHCHECK CMD",
844
+ "documentation": {
845
+ "value": "Health check with HTTP endpoint."
846
+ },
847
+ "insertText": "HEALTHCHECK --interval=${1:30s} --timeout=${2:10s} --start-period=${3:5s} --retries=${4:3} \\\n CMD ${5:curl -f http://localhost:${6:8080}/health || exit 1}",
848
+ "insertTextRules": 4,
849
+ "sortText": "14_healthcheck_cmd"
850
+ },
851
+ {
852
+ "label": "HEALTHCHECK wget",
853
+ "kind": 15,
854
+ "detail": "HEALTHCHECK with wget",
855
+ "documentation": {
856
+ "value": "Health check using wget (for alpine/minimal images)."
857
+ },
858
+ "insertText": "HEALTHCHECK --interval=${1:30s} --timeout=${2:10s} --retries=${3:3} \\\n CMD wget --quiet --tries=1 --spider http://localhost:${4:8080}/health || exit 1",
859
+ "insertTextRules": 4,
860
+ "sortText": "14_healthcheck_wget"
861
+ },
862
+ {
863
+ "label": "HEALTHCHECK NONE",
864
+ "kind": 15,
865
+ "detail": "HEALTHCHECK NONE",
866
+ "documentation": {
867
+ "value": "Disable health check inherited from base image."
868
+ },
869
+ "insertText": "HEALTHCHECK NONE",
870
+ "insertTextRules": 4,
871
+ "sortText": "14_healthcheck_none"
872
+ },
873
+ {
874
+ "label": "SHELL bash",
875
+ "kind": 15,
876
+ "detail": "SHELL set to bash",
877
+ "documentation": {
878
+ "value": "Set default shell to bash."
879
+ },
880
+ "insertText": "SHELL [\"/bin/bash\", \"-c\"]",
881
+ "insertTextRules": 4,
882
+ "sortText": "15_shell_bash"
883
+ },
884
+ {
885
+ "label": "SHELL powershell",
886
+ "kind": 15,
887
+ "detail": "SHELL set to PowerShell",
888
+ "documentation": {
889
+ "value": "Set default shell to PowerShell (Windows)."
890
+ },
891
+ "insertText": "SHELL [\"powershell\", \"-Command\"]",
892
+ "insertTextRules": 4,
893
+ "sortText": "15_shell_powershell"
894
+ },
895
+ {
896
+ "label": "# syntax=",
897
+ "kind": 15,
898
+ "detail": "syntax parser directive",
899
+ "documentation": {
900
+ "value": "Set BuildKit frontend syntax (must be first line)."
901
+ },
902
+ "insertText": "# syntax=docker/dockerfile:${1|1,1.4,1.5,1.6,1.7,labs|}",
903
+ "insertTextRules": 4,
904
+ "sortText": "00_syntax"
905
+ },
906
+ {
907
+ "label": "# escape=",
908
+ "kind": 15,
909
+ "detail": "escape parser directive",
910
+ "documentation": {
911
+ "value": "Change the escape character (must be before any instruction)."
912
+ },
913
+ "insertText": "# escape=${1|\\\\,`|}",
914
+ "insertTextRules": 4,
915
+ "sortText": "00_escape"
916
+ },
917
+ {
918
+ "label": "Dockerfile: Node.js multi-stage",
919
+ "kind": 15,
920
+ "detail": "Node.js multi-stage Dockerfile",
921
+ "documentation": {
922
+ "value": "Production-ready multi-stage Dockerfile for a Node.js application."
923
+ },
924
+ "insertText": "# syntax=docker/dockerfile:1\nFROM node:${1:20}-alpine AS deps\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nFROM node:${1:20}-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM node:${1:20}-alpine\nWORKDIR /app\nENV NODE_ENV=production\nRUN addgroup -S appuser && adduser -S appuser -G appuser\nCOPY --from=deps /app/node_modules ./node_modules\nCOPY --from=builder /app/dist ./dist\nCOPY package*.json ./\nUSER appuser\nEXPOSE ${2:3000}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD wget --quiet --tries=1 --spider http://localhost:${2:3000}/health || exit 1\nCMD [\"node\", \"dist/index.js\"]",
925
+ "insertTextRules": 4,
926
+ "sortText": "20_tmpl_node"
927
+ },
928
+ {
929
+ "label": "Dockerfile: Python multi-stage",
930
+ "kind": 15,
931
+ "detail": "Python multi-stage Dockerfile",
932
+ "documentation": {
933
+ "value": "Production-ready multi-stage Dockerfile for a Python application."
934
+ },
935
+ "insertText": "# syntax=docker/dockerfile:1\nFROM python:${1:3.12}-slim AS builder\nWORKDIR /app\nENV PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONUNBUFFERED=1\nCOPY requirements.txt .\nRUN pip install --no-cache-dir --prefix=/install -r requirements.txt\n\nFROM python:${1:3.12}-slim\nWORKDIR /app\nENV PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONUNBUFFERED=1\nRUN groupadd -r appuser && useradd -r -g appuser appuser\nCOPY --from=builder /install /usr/local\nCOPY . .\nUSER appuser\nEXPOSE ${2:8000}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD python -c \"import urllib.request; urllib.request.urlopen('http://localhost:${2:8000}/health')\" || exit 1\nCMD [\"python\", \"-m\", \"${3:app}\"]",
936
+ "insertTextRules": 4,
937
+ "sortText": "20_tmpl_python"
938
+ },
939
+ {
940
+ "label": "Dockerfile: Go multi-stage",
941
+ "kind": 15,
942
+ "detail": "Go multi-stage Dockerfile",
943
+ "documentation": {
944
+ "value": "Production-ready multi-stage Dockerfile for a Go application."
945
+ },
946
+ "insertText": "# syntax=docker/dockerfile:1\nFROM golang:${1:1.22}-alpine AS builder\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -ldflags=\"-s -w\" -o /app/server ./cmd/${2:server}\n\nFROM gcr.io/distroless/static-debian12\nCOPY --from=builder /app/server /server\nEXPOSE ${3:8080}\nUSER nonroot:nonroot\nENTRYPOINT [\"/server\"]",
947
+ "insertTextRules": 4,
948
+ "sortText": "20_tmpl_go"
949
+ },
950
+ {
951
+ "label": "Dockerfile: Java Maven multi-stage",
952
+ "kind": 15,
953
+ "detail": "Java/Maven multi-stage Dockerfile",
954
+ "documentation": {
955
+ "value": "Production-ready multi-stage Dockerfile for a Java application built with Maven."
956
+ },
957
+ "insertText": "# syntax=docker/dockerfile:1\nFROM maven:${1:3.9}-eclipse-temurin-${2:21} AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests -B\n\nFROM eclipse-temurin:${2:21}-jre-alpine\nWORKDIR /app\nRUN addgroup -S appuser && adduser -S appuser -G appuser\nCOPY --from=builder /app/target/*.jar app.jar\nUSER appuser\nEXPOSE ${3:8080}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD wget --quiet --tries=1 --spider http://localhost:${3:8080}/actuator/health || exit 1\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]",
958
+ "insertTextRules": 4,
959
+ "sortText": "20_tmpl_java"
960
+ },
961
+ {
962
+ "label": "Dockerfile: Rust multi-stage",
963
+ "kind": 15,
964
+ "detail": "Rust multi-stage Dockerfile",
965
+ "documentation": {
966
+ "value": "Production-ready multi-stage Dockerfile for a Rust application."
967
+ },
968
+ "insertText": "# syntax=docker/dockerfile:1\nFROM rust:${1:1.77}-slim AS builder\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nRUN mkdir src && echo \"fn main() {}\" > src/main.rs && cargo build --release && rm -rf src\nCOPY src ./src\nRUN cargo build --release\n\nFROM debian:${2:bookworm}-slim\nRUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \\\n && rm -rf /var/lib/apt/lists/*\nRUN groupadd -r appuser && useradd -r -g appuser appuser\nCOPY --from=builder /app/target/release/${3:myapp} /usr/local/bin/\nUSER appuser\nEXPOSE ${4:8080}\nENTRYPOINT [\"${3:myapp}\"]",
969
+ "insertTextRules": 4,
970
+ "sortText": "20_tmpl_rust"
971
+ },
972
+ {
973
+ "label": "Dockerfile: .NET multi-stage",
974
+ "kind": 15,
975
+ "detail": ".NET multi-stage Dockerfile",
976
+ "documentation": {
977
+ "value": "Production-ready multi-stage Dockerfile for a .NET application."
978
+ },
979
+ "insertText": "# syntax=docker/dockerfile:1\nFROM mcr.microsoft.com/dotnet/sdk:${1:8.0} AS builder\nWORKDIR /app\nCOPY *.csproj .\nRUN dotnet restore\nCOPY . .\nRUN dotnet publish -c Release -o /out --no-restore\n\nFROM mcr.microsoft.com/dotnet/aspnet:${1:8.0}\nWORKDIR /app\nRUN groupadd -r appuser && useradd -r -g appuser appuser\nCOPY --from=builder /out .\nUSER appuser\nEXPOSE ${2:8080}\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD curl -f http://localhost:${2:8080}/health || exit 1\nENTRYPOINT [\"dotnet\", \"${3:MyApp}.dll\"]",
980
+ "insertTextRules": 4,
981
+ "sortText": "20_tmpl_dotnet"
982
+ },
983
+ {
984
+ "label": "Dockerfile: Nginx static site",
985
+ "kind": 15,
986
+ "detail": "Nginx static site Dockerfile",
987
+ "documentation": {
988
+ "value": "Serve static files with Nginx using a multi-stage build."
989
+ },
990
+ "insertText": "# syntax=docker/dockerfile:1\nFROM node:${1:20}-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM nginx:${2:alpine}\nCOPY --from=builder /app/${3:dist} /usr/share/nginx/html\nCOPY ${4:nginx.conf} /etc/nginx/conf.d/default.conf\nEXPOSE 80\nHEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n CMD curl -f http://localhost/ || exit 1\nCMD [\"nginx\", \"-g\", \"daemon off;\"]",
991
+ "insertTextRules": 4,
992
+ "sortText": "20_tmpl_nginx"
993
+ },
994
+ {
995
+ "label": "Dockerfile: PHP-FPM",
996
+ "kind": 15,
997
+ "detail": "PHP-FPM Dockerfile",
998
+ "documentation": {
999
+ "value": "PHP-FPM application Dockerfile with Composer."
1000
+ },
1001
+ "insertText": "# syntax=docker/dockerfile:1\nFROM composer:${1:2} AS vendor\nWORKDIR /app\nCOPY composer.json composer.lock ./\nRUN composer install --no-dev --no-scripts --no-autoloader\nCOPY . .\nRUN composer dump-autoload --optimize\n\nFROM php:${2:8.3}-fpm-alpine\nWORKDIR /var/www/html\nRUN docker-php-ext-install pdo pdo_mysql opcache\nCOPY --from=vendor /app .\nRUN chown -R www-data:www-data /var/www/html\nUSER www-data\nEXPOSE 9000\nCMD [\"php-fpm\"]",
1002
+ "insertTextRules": 4,
1003
+ "sortText": "20_tmpl_php"
1004
+ },
1005
+ {
1006
+ "label": "Dockerfile: Ruby/Rails",
1007
+ "kind": 15,
1008
+ "detail": "Ruby/Rails Dockerfile",
1009
+ "documentation": {
1010
+ "value": "Production-ready Dockerfile for a Ruby on Rails application."
1011
+ },
1012
+ "insertText": "# syntax=docker/dockerfile:1\nFROM ruby:${1:3.3}-slim AS builder\nWORKDIR /app\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n build-essential libpq-dev \\\n && rm -rf /var/lib/apt/lists/*\nCOPY Gemfile Gemfile.lock ./\nRUN bundle config set --local deployment true \\\n && bundle config set --local without \"development test\" \\\n && bundle install\n\nFROM ruby:${1:3.3}-slim\nWORKDIR /app\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n libpq5 \\\n && rm -rf /var/lib/apt/lists/*\nRUN groupadd -r rails && useradd -r -g rails rails\nCOPY --from=builder /app/vendor/bundle ./vendor/bundle\nCOPY . .\nRUN bundle config set --local path vendor/bundle\nUSER rails\nEXPOSE ${2:3000}\nCMD [\"bundle\", \"exec\", \"rails\", \"server\", \"-b\", \"0.0.0.0\"]",
1013
+ "insertTextRules": 4,
1014
+ "sortText": "20_tmpl_ruby"
1015
+ },
1016
+ {
1017
+ "label": "Non-root user setup",
1018
+ "kind": 15,
1019
+ "detail": "Non-root user pattern",
1020
+ "documentation": {
1021
+ "value": "Best practice: create and switch to a non-root user."
1022
+ },
1023
+ "insertText": "RUN groupadd -r ${1:appuser} && useradd -r -g ${1:appuser} -d /home/${1:appuser} -s /sbin/nologin ${1:appuser} \\\n && mkdir -p /home/${1:appuser} && chown -R ${1:appuser}:${1:appuser} /home/${1:appuser}\nUSER ${1:appuser}",
1024
+ "insertTextRules": 4,
1025
+ "sortText": "18_bp_nonroot"
1026
+ },
1027
+ {
1028
+ "label": "apt-get best practice",
1029
+ "kind": 15,
1030
+ "detail": "apt-get best practice layer",
1031
+ "documentation": {
1032
+ "value": "Install packages and clean up in a single layer."
1033
+ },
1034
+ "insertText": "RUN apt-get update \\\n && apt-get install -y --no-install-recommends \\\n ${1:curl} \\\n ${2:ca-certificates} \\\n && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \\\n && rm -rf /var/lib/apt/lists/*",
1035
+ "insertTextRules": 4,
1036
+ "sortText": "18_bp_apt"
1037
+ },
1038
+ {
1039
+ "label": "pip best practice",
1040
+ "kind": 15,
1041
+ "detail": "pip install best practice",
1042
+ "documentation": {
1043
+ "value": "Install Python packages without cache."
1044
+ },
1045
+ "insertText": "COPY requirements.txt .\nRUN pip install --no-cache-dir --upgrade pip \\\n && pip install --no-cache-dir -r requirements.txt",
1046
+ "insertTextRules": 4,
1047
+ "sortText": "18_bp_pip"
1048
+ },
1049
+ {
1050
+ "label": "npm ci pattern",
1051
+ "kind": 15,
1052
+ "detail": "npm ci production pattern",
1053
+ "documentation": {
1054
+ "value": "Install production Node.js dependencies."
1055
+ },
1056
+ "insertText": "COPY package.json package-lock.json ./\nRUN npm ci --only=production \\\n && npm cache clean --force",
1057
+ "insertTextRules": 4,
1058
+ "sortText": "18_bp_npm"
1059
+ },
1060
+ {
1061
+ "label": "Multi-stage build pattern",
1062
+ "kind": 15,
1063
+ "detail": "Multi-stage build skeleton",
1064
+ "documentation": {
1065
+ "value": "Basic multi-stage build skeleton."
1066
+ },
1067
+ "insertText": "FROM ${1:node:20-alpine} AS builder\nWORKDIR /app\nCOPY . .\nRUN ${2:npm ci && npm run build}\n\nFROM ${3:node:20-alpine}\nWORKDIR /app\nCOPY --from=builder /app/${4:dist} ./${4:dist}\nEXPOSE ${5:3000}\nCMD ${6:[\"node\", \"dist/index.js\"]}",
1068
+ "insertTextRules": 4,
1069
+ "sortText": "18_bp_multistage"
1070
+ },
1071
+ {
1072
+ "label": "Distroless final stage",
1073
+ "kind": 15,
1074
+ "detail": "Distroless final stage",
1075
+ "documentation": {
1076
+ "value": "Use Google distroless as the final minimal image."
1077
+ },
1078
+ "insertText": "FROM gcr.io/distroless/${1|static-debian12,base-debian12,cc-debian12,java21-debian12,python3-debian12,nodejs22-debian12|}\nCOPY --from=builder ${2:/app/binary} ${3:/}\nUSER nonroot:nonroot\nENTRYPOINT [\"${4:/binary}\"]",
1079
+ "insertTextRules": 4,
1080
+ "sortText": "18_bp_distroless"
1081
+ },
1082
+ {
1083
+ "label": "Signal handling (tini)",
1084
+ "kind": 15,
1085
+ "detail": "Signal handling with tini",
1086
+ "documentation": {
1087
+ "value": "Use tini init for proper PID 1 signal handling."
1088
+ },
1089
+ "insertText": "RUN apt-get update && apt-get install -y --no-install-recommends tini \\\n && rm -rf /var/lib/apt/lists/*\nENTRYPOINT [\"tini\", \"--\"]\nCMD [\"${1:node}\", \"${2:server.js}\"]",
1090
+ "insertTextRules": 4,
1091
+ "sortText": "18_bp_tini"
1092
+ },
1093
+ {
1094
+ "label": "Build cache optimization",
1095
+ "kind": 15,
1096
+ "detail": "Layer caching order",
1097
+ "documentation": {
1098
+ "value": "Copy dependency files before source for cache optimization."
1099
+ },
1100
+ "insertText": "# Copy dependency manifests first (changes less often)\nCOPY ${1:package.json} ${2:package-lock.json} ./\nRUN ${3:npm ci}\n\n# Copy source code (changes more often)\nCOPY . .\nRUN ${4:npm run build}",
1101
+ "insertTextRules": 4,
1102
+ "sortText": "18_bp_cache_order"
1103
+ },
1104
+ {
1105
+ "label": "FROM alpine",
1106
+ "kind": 15,
1107
+ "detail": "Alpine Linux",
1108
+ "documentation": {
1109
+ "value": "Minimal 5MB Alpine Linux base image."
1110
+ },
1111
+ "insertText": "FROM alpine:${1:3.19}",
1112
+ "insertTextRules": 4,
1113
+ "sortText": "19_base_alpine"
1114
+ },
1115
+ {
1116
+ "label": "FROM node:alpine",
1117
+ "kind": 15,
1118
+ "detail": "Node.js Alpine",
1119
+ "documentation": {
1120
+ "value": "Node.js on Alpine Linux."
1121
+ },
1122
+ "insertText": "FROM node:${1:20}-alpine",
1123
+ "insertTextRules": 4,
1124
+ "sortText": "19_base_node_alpine"
1125
+ },
1126
+ {
1127
+ "label": "FROM node:slim",
1128
+ "kind": 15,
1129
+ "detail": "Node.js Slim",
1130
+ "documentation": {
1131
+ "value": "Node.js on Debian slim."
1132
+ },
1133
+ "insertText": "FROM node:${1:20}-slim",
1134
+ "insertTextRules": 4,
1135
+ "sortText": "19_base_node_slim"
1136
+ },
1137
+ {
1138
+ "label": "FROM python:slim",
1139
+ "kind": 15,
1140
+ "detail": "Python Slim",
1141
+ "documentation": {
1142
+ "value": "Python on Debian slim."
1143
+ },
1144
+ "insertText": "FROM python:${1:3.12}-slim",
1145
+ "insertTextRules": 4,
1146
+ "sortText": "19_base_python_slim"
1147
+ },
1148
+ {
1149
+ "label": "FROM python:alpine",
1150
+ "kind": 15,
1151
+ "detail": "Python Alpine",
1152
+ "documentation": {
1153
+ "value": "Python on Alpine Linux."
1154
+ },
1155
+ "insertText": "FROM python:${1:3.12}-alpine",
1156
+ "insertTextRules": 4,
1157
+ "sortText": "19_base_python_alpine"
1158
+ },
1159
+ {
1160
+ "label": "FROM golang:alpine",
1161
+ "kind": 15,
1162
+ "detail": "Go Alpine",
1163
+ "documentation": {
1164
+ "value": "Go on Alpine Linux."
1165
+ },
1166
+ "insertText": "FROM golang:${1:1.22}-alpine",
1167
+ "insertTextRules": 4,
1168
+ "sortText": "19_base_golang_alpine"
1169
+ },
1170
+ {
1171
+ "label": "FROM ubuntu",
1172
+ "kind": 15,
1173
+ "detail": "Ubuntu",
1174
+ "documentation": {
1175
+ "value": "Ubuntu base image."
1176
+ },
1177
+ "insertText": "FROM ubuntu:${1:24.04}",
1178
+ "insertTextRules": 4,
1179
+ "sortText": "19_base_ubuntu"
1180
+ },
1181
+ {
1182
+ "label": "FROM debian:slim",
1183
+ "kind": 15,
1184
+ "detail": "Debian Slim",
1185
+ "documentation": {
1186
+ "value": "Minimal Debian base image."
1187
+ },
1188
+ "insertText": "FROM debian:${1:bookworm}-slim",
1189
+ "insertTextRules": 4,
1190
+ "sortText": "19_base_debian_slim"
1191
+ },
1192
+ {
1193
+ "label": "FROM nginx:alpine",
1194
+ "kind": 15,
1195
+ "detail": "Nginx Alpine",
1196
+ "documentation": {
1197
+ "value": "Nginx on Alpine Linux."
1198
+ },
1199
+ "insertText": "FROM nginx:${1:alpine}",
1200
+ "insertTextRules": 4,
1201
+ "sortText": "19_base_nginx_alpine"
1202
+ },
1203
+ {
1204
+ "label": "FROM distroless",
1205
+ "kind": 15,
1206
+ "detail": "Distroless static",
1207
+ "documentation": {
1208
+ "value": "Google distroless static image (no shell)."
1209
+ },
1210
+ "insertText": "FROM gcr.io/distroless/static-debian12",
1211
+ "insertTextRules": 4,
1212
+ "sortText": "19_base_distroless"
1213
+ },
1214
+ {
1215
+ "label": "COPY --parents",
1216
+ "kind": 15,
1217
+ "detail": "Copy preserving directory structure",
1218
+ "documentation": {
1219
+ "value": "Copy files preserving parent directory structure (BuildKit).\n\n```dockerfile\nCOPY --parents src/app/config.json /app/\n# Creates /app/src/app/config.json\n```"
1220
+ },
1221
+ "insertText": "COPY --parents ${1:src/dir/} ${2:/dest/}",
1222
+ "insertTextRules": 4,
1223
+ "sortText": "02_copy_parents"
1224
+ },
1225
+ {
1226
+ "label": "ADD --keep-git-dir",
1227
+ "kind": 15,
1228
+ "detail": "Add Git repo keeping .git",
1229
+ "documentation": {
1230
+ "value": "Clone and keep the .git directory (BuildKit).\n\n```dockerfile\nADD --keep-git-dir=true https://github.com/user/repo.git /src\n```"
1231
+ },
1232
+ "insertText": "ADD --keep-git-dir=true ${1:https://github.com/user/repo.git} ${2:/src}",
1233
+ "insertTextRules": 4,
1234
+ "sortText": "02_add_gitdir"
1235
+ },
1236
+ {
1237
+ "label": ".dockerignore pattern",
1238
+ "kind": 15,
1239
+ "detail": ".dockerignore best practice",
1240
+ "documentation": {
1241
+ "value": "Recommended .dockerignore contents to reduce build context.\n\n```\n# .dockerignore\nnode_modules\n.git\n.env\n*.md\nDockerfile*\ndocker-compose*\n.dockerignore\n.vscode\n__pycache__\n*.pyc\n.tox\n.coverage\ndist\nbuild\n```"
1242
+ },
1243
+ "insertText": "# .dockerignore\nnode_modules\n.git\n.env\n*.md\nDockerfile*\ndocker-compose*\n.dockerignore\n${1:.vscode}",
1244
+ "insertTextRules": 4,
1245
+ "sortText": "09_dockerignore"
1246
+ },
1247
+ {
1248
+ "label": "COPY heredoc",
1249
+ "kind": 15,
1250
+ "detail": "Inline file creation with heredoc",
1251
+ "documentation": {
1252
+ "value": "Create files inline using heredoc syntax (BuildKit).\n\n```dockerfile\nCOPY <<EOF /app/config.json\n{\"key\": \"value\"}\nEOF\n```"
1253
+ },
1254
+ "insertText": "COPY <<EOF ${1:/app/config.json}\n${2:content}\nEOF",
1255
+ "insertTextRules": 4,
1256
+ "sortText": "02_copy_heredoc"
1257
+ },
1258
+ {
1259
+ "label": "RUN pipe pattern",
1260
+ "kind": 15,
1261
+ "detail": "RUN with pipe and set -o pipefail",
1262
+ "documentation": {
1263
+ "value": "Use pipefail for reliable pipe error detection.\n\n```dockerfile\nRUN set -o pipefail && curl -fsSL https://example.com/install.sh | bash\n```"
1264
+ },
1265
+ "insertText": "RUN set -o pipefail && ${1:curl -fsSL https://example.com/install.sh} | ${2:bash}",
1266
+ "insertTextRules": 4,
1267
+ "sortText": "01_run_pipe"
1268
+ }
1269
+ ]
1270
+ }