@nitra/cursor 1.8.138 → 1.8.139
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.
- package/mdc/abie.mdc +1 -1
- package/mdc/docker.mdc +4 -0
- package/package.json +1 -1
- package/scripts/check-docker.mjs +34 -0
package/mdc/abie.mdc
CHANGED
package/mdc/docker.mdc
CHANGED
|
@@ -21,6 +21,10 @@ alwaysApply: false
|
|
|
21
21
|
|
|
22
22
|
Це стримує зайвий build tooling (Bun, **node_modules** зі збірки) у фінальному образі; для **alpine** / **nginx** / **openresty** у **runtime** лишаються лише відповідні вимоги, для **php** / **python** (виняток) — цільовий інтерпретований **stack**; **scratch** і **debian** з тегом **`*slim*`** — коли glibc і мінімальне оточення Debian важливіші за musl в **alpine**.
|
|
23
23
|
|
|
24
|
+
## Мінімальні образи
|
|
25
|
+
|
|
26
|
+
Якщо використовується nginx, то намагайся щоб тег був `alpine-slim`
|
|
27
|
+
|
|
24
28
|
## компіляція
|
|
25
29
|
|
|
26
30
|
Якщо проект має bun install крок, та не є фронтенд проектом (тобто не має bun build крок), то потрібно щоб була компіляція коду, і далі у фінальному образі був тільки бінарник і Цей образ не містив компілятора, npm, Bun — тільки runtime libs. Наприклад:
|
package/package.json
CHANGED
package/scripts/check-docker.mjs
CHANGED
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
* Мета — щоб у фінальному образі не було build tooling (Bun/Node та залежностей), а лише
|
|
19
19
|
* дозволений runtime (alpine, scratch, debian slim, за потреби php/python, nginx або openresty).
|
|
20
20
|
*
|
|
21
|
+
* Для `mirror.gcr.io/library/nginx` у будь-якому `FROM` очікується тег `alpine-slim` (docker.mdc:
|
|
22
|
+
* мінімальні образи), не `latest` / `alpine` / інші.
|
|
23
|
+
*
|
|
21
24
|
* Знаходить Dockerfile, Dockerfile.*, Containerfile, Containerfile.*; пропускає node_modules, .git
|
|
22
25
|
* тощо. Спочатку hadolint з PATH, інакше docker run з образом hadolint/hadolint.
|
|
23
26
|
* Кореневий .hadolint.yaml підхоплюється hadolint автоматично.
|
|
@@ -36,6 +39,8 @@ const BUN_BUILD_COMPILE_RE = /\bbun\s+build\b[^\n]*\s--compile\b/iu
|
|
|
36
39
|
const BUN_WORD_RE = /\bbun\b/iu
|
|
37
40
|
const USER_LINE_RE = /^\s*USER\s+([^\s#]+)/iu
|
|
38
41
|
|
|
42
|
+
const NGINX_MIRROR_PREFIX = 'mirror.gcr.io/library/nginx'
|
|
43
|
+
|
|
39
44
|
/**
|
|
40
45
|
* @typedef {{
|
|
41
46
|
* line: number
|
|
@@ -203,6 +208,30 @@ export function getBunCompileHint(fileContent) {
|
|
|
203
208
|
return null
|
|
204
209
|
}
|
|
205
210
|
|
|
211
|
+
/**
|
|
212
|
+
* Перевіряє, що для `mirror.gcr.io/library/nginx` у `FROM` вказано тег `alpine-slim` (docker.mdc).
|
|
213
|
+
*
|
|
214
|
+
* @param {string} fileContent вміст Dockerfile/Containerfile
|
|
215
|
+
* @returns {string | null} повідомлення помилки або null
|
|
216
|
+
*/
|
|
217
|
+
export function getNginxAlpineSlimTagHint(fileContent) {
|
|
218
|
+
for (const { line, image } of parseFromStages(fileContent)) {
|
|
219
|
+
const noDigest = (image.split('@')[0] || '').trim()
|
|
220
|
+
const d = noDigest.toLowerCase()
|
|
221
|
+
if (!d.startsWith(`${NGINX_MIRROR_PREFIX}:`) && d !== NGINX_MIRROR_PREFIX) {
|
|
222
|
+
continue
|
|
223
|
+
}
|
|
224
|
+
if (d === NGINX_MIRROR_PREFIX) {
|
|
225
|
+
return `рядок ${line}: \`FROM mirror.gcr.io/library/nginx\` має явний тег \`alpine-slim\` (docker.mdc: мінімальні образи), зараз без тега (типово latest)`
|
|
226
|
+
}
|
|
227
|
+
const tag = noDigest.slice(NGINX_MIRROR_PREFIX.length + 1)
|
|
228
|
+
if (tag.toLowerCase() !== 'alpine-slim') {
|
|
229
|
+
return `рядок ${line}: для nginx потрібен тег \`alpine-slim\` (docker.mdc: мінімальні образи), зараз: \`${tag}\``
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return null
|
|
233
|
+
}
|
|
234
|
+
|
|
206
235
|
/**
|
|
207
236
|
* Перевіряє вимогу "non-root" у фінальному runtime stage (docker.mdc).
|
|
208
237
|
*
|
|
@@ -282,6 +311,11 @@ export async function check() {
|
|
|
282
311
|
fail(`${rel} (non-root): ${nonRootHint}`)
|
|
283
312
|
}
|
|
284
313
|
|
|
314
|
+
const nginxSlimHint = getNginxAlpineSlimTagHint(content)
|
|
315
|
+
if (nginxSlimHint) {
|
|
316
|
+
fail(`${rel} (nginx tag): ${nginxSlimHint}`)
|
|
317
|
+
}
|
|
318
|
+
|
|
285
319
|
const { ok, stdout, stderr, via } = lintDockerfileWithHadolint(root, abs)
|
|
286
320
|
const tail = (stdout + stderr).trim()
|
|
287
321
|
if (ok) {
|