@deftai/directive-content 0.55.0
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/.agents/skills/deft/SKILL.md +6 -0
- package/.agents/skills/deft-directive-article-review/SKILL.md +11 -0
- package/.agents/skills/deft-directive-build/SKILL.md +10 -0
- package/.agents/skills/deft-directive-cost/SKILL.md +12 -0
- package/.agents/skills/deft-directive-debug/SKILL.md +13 -0
- package/.agents/skills/deft-directive-gh-arch/SKILL.md +11 -0
- package/.agents/skills/deft-directive-gh-slice/SKILL.md +10 -0
- package/.agents/skills/deft-directive-glossary/SKILL.md +10 -0
- package/.agents/skills/deft-directive-interview/SKILL.md +9 -0
- package/.agents/skills/deft-directive-pre-pr/SKILL.md +9 -0
- package/.agents/skills/deft-directive-refinement/SKILL.md +10 -0
- package/.agents/skills/deft-directive-release/SKILL.md +12 -0
- package/.agents/skills/deft-directive-review-cycle/SKILL.md +10 -0
- package/.agents/skills/deft-directive-setup/SKILL.md +10 -0
- package/.agents/skills/deft-directive-swarm/SKILL.md +10 -0
- package/.agents/skills/deft-directive-sync/SKILL.md +9 -0
- package/.agents/skills/deft-directive-triage/SKILL.md +9 -0
- package/.agents/skills/deft-directive-write-skill/SKILL.md +9 -0
- package/LICENSE.md +22 -0
- package/QUICK-START.md +167 -0
- package/UPGRADING.md +517 -0
- package/coding/build-output.md +28 -0
- package/coding/coding.md +235 -0
- package/coding/debugging.md +110 -0
- package/coding/holzmann.md +96 -0
- package/coding/hygiene.md +127 -0
- package/coding/security.md +158 -0
- package/coding/testing.md +162 -0
- package/coding/toolchain.md +44 -0
- package/commands.md +300 -0
- package/context/context.md +57 -0
- package/context/deterministic-split.md +67 -0
- package/context/examples.md +26 -0
- package/context/fractal-summaries.md +69 -0
- package/context/long-horizon.md +46 -0
- package/context/spec-deltas.md +177 -0
- package/context/tool-design.md +34 -0
- package/context/working-memory.md +62 -0
- package/contracts/boundary-maps.md +65 -0
- package/contracts/deterministic-questions.md +59 -0
- package/contracts/hierarchy.md +77 -0
- package/conventions/content-manifest.json +399 -0
- package/conventions/machine-generated-banner.md +130 -0
- package/conventions/references.md +120 -0
- package/conventions/rule-ownership.json +382 -0
- package/conventions/task-caching.md +43 -0
- package/conventions/vbrief-filenames.md +70 -0
- package/deployments/README.md +37 -0
- package/deployments/agentuity/README.md +138 -0
- package/deployments/agentuity/via-cli.md +380 -0
- package/deployments/agentuity/via-cloud.md +425 -0
- package/deployments/agentuity/via-github-actions.md +664 -0
- package/deployments/agentuity/via-gravity-network.md +606 -0
- package/deployments/agentuity/via-vpc.md +607 -0
- package/deployments/aws/README.md +38 -0
- package/deployments/aws/via-app-runner.md +612 -0
- package/deployments/aws/via-ecs-fargate.md +561 -0
- package/deployments/aws/via-elastic-beanstalk.md +628 -0
- package/deployments/aws/via-lambda.md +649 -0
- package/deployments/azure/README.md +37 -0
- package/deployments/azure/via-aks.md +390 -0
- package/deployments/azure/via-app-service.md +564 -0
- package/deployments/azure/via-container-apps.md +599 -0
- package/deployments/azure/via-functions.md +552 -0
- package/deployments/cloud-gov/README.md +63 -0
- package/deployments/cloud-gov/agents/compliance-docs.md +154 -0
- package/deployments/cloud-gov/agents.md +39 -0
- package/deployments/cloud-gov/cicd.md +64 -0
- package/deployments/cloud-gov/deployment.md +150 -0
- package/deployments/cloud-gov/logging.md +43 -0
- package/deployments/cloud-gov/manifest.md +121 -0
- package/deployments/cloud-gov/overview.md +58 -0
- package/deployments/cloud-gov/security.md +46 -0
- package/deployments/cloud-gov/services.md +72 -0
- package/deployments/cloud-gov/upstream/README.md +18 -0
- package/deployments/cloudflare/README.md +33 -0
- package/deployments/cloudflare/via-dashboard.md +83 -0
- package/deployments/cloudflare/via-git.md +90 -0
- package/deployments/cloudflare/via-github-actions.md +185 -0
- package/deployments/cloudflare/via-terraform.md +157 -0
- package/deployments/cloudflare/via-wrangler.md +165 -0
- package/deployments/fly-io/README.md +37 -0
- package/deployments/fly-io/via-dockerfile.md +648 -0
- package/deployments/fly-io/via-flyctl.md +653 -0
- package/deployments/fly-io/via-github-actions.md +695 -0
- package/deployments/fly-io/via-multi-region.md +598 -0
- package/deployments/google/README.md +34 -0
- package/deployments/google/via-app-engine.md +42 -0
- package/deployments/google/via-cloud-functions.md +23 -0
- package/deployments/google/via-cloud-run.md +330 -0
- package/deployments/google/via-gke.md +23 -0
- package/deployments/netlify/README.md +99 -0
- package/deployments/netlify/via-cli.md +17 -0
- package/deployments/netlify/via-functions.md +19 -0
- package/deployments/netlify/via-git.md +25 -0
- package/deployments/vercel/README.md +90 -0
- package/deployments/vercel/via-api.md +16 -0
- package/deployments/vercel/via-cli.md +17 -0
- package/deployments/vercel/via-git.md +24 -0
- package/docs/BROWNFIELD.md +179 -0
- package/docs/getting-started.md +137 -0
- package/docs/good-agents-md.md +137 -0
- package/events/README.md +89 -0
- package/events/event-record.schema.json +26 -0
- package/events/registry.json +166 -0
- package/events/registry.schema.json +71 -0
- package/glossary.md +145 -0
- package/incidents/README.md +81 -0
- package/incidents/_template.md +38 -0
- package/interfaces/cli.md +104 -0
- package/interfaces/rest.md +212 -0
- package/interfaces/tui.md +242 -0
- package/interfaces/web.md +123 -0
- package/languages/6502-DASM.md +132 -0
- package/languages/c.md +235 -0
- package/languages/commands.md +23 -0
- package/languages/cpp.md +132 -0
- package/languages/csharp.md +259 -0
- package/languages/dart.md +183 -0
- package/languages/delphi.md +218 -0
- package/languages/elixir.md +208 -0
- package/languages/go.md +78 -0
- package/languages/java.md +278 -0
- package/languages/javascript.md +163 -0
- package/languages/julia.md +175 -0
- package/languages/kotlin.md +193 -0
- package/languages/markdown.md +168 -0
- package/languages/mermaid.md +146 -0
- package/languages/officejs.md +392 -0
- package/languages/python.md +209 -0
- package/languages/r.md +163 -0
- package/languages/rust.md +216 -0
- package/languages/sql.md +216 -0
- package/languages/swift.md +153 -0
- package/languages/typescript.md +132 -0
- package/languages/vba.md +279 -0
- package/languages/vhdl.md +180 -0
- package/languages/visual-basic.md +151 -0
- package/languages/zig.md +196 -0
- package/meta/SOUL.md +27 -0
- package/meta/code-field.md +44 -0
- package/meta/morals.md +40 -0
- package/meta/philosophy.md +39 -0
- package/meta/project.md +49 -0
- package/meta/ralph.md +223 -0
- package/meta/security.md +80 -0
- package/meta/versioning.md +326 -0
- package/package.json +22 -0
- package/packs/lessons/lessons-pack-0.1.json +553 -0
- package/packs/patterns/patterns-pack-0.1.json +57 -0
- package/packs/rules/rules-pack-0.1.json +4767 -0
- package/packs/skills/skills-pack-0.1.json +262 -0
- package/packs/strategies/strategies-pack-0.1.json +167 -0
- package/packs/swarm-spec/swarm-spec-pack-0.1.json +17 -0
- package/patterns/executor-layer-credentials.md +227 -0
- package/patterns/llm-app.md +156 -0
- package/patterns/multi-agent.md +278 -0
- package/patterns/prompt-assembly-layer-ordering.md +154 -0
- package/patterns/role-as-overlay.md +179 -0
- package/platforms/2600.md +137 -0
- package/platforms/unity.md +329 -0
- package/references/composer-skill-porting.md +152 -0
- package/references/cost-models.md +163 -0
- package/references/ip-risk.md +246 -0
- package/references/plain-english-ux.md +275 -0
- package/resilience/context-pruning.md +67 -0
- package/resilience/continue-here.md +62 -0
- package/scm/changelog.md +276 -0
- package/scm/git.md +139 -0
- package/scm/github.md +265 -0
- package/secrets/.gitkeep +0 -0
- package/skills/deft-build/SKILL.md +20 -0
- package/skills/deft-directive-article-review/SKILL.md +156 -0
- package/skills/deft-directive-build/SKILL.md +302 -0
- package/skills/deft-directive-cost/SKILL.md +201 -0
- package/skills/deft-directive-debug/SKILL.md +140 -0
- package/skills/deft-directive-decompose/SKILL.md +96 -0
- package/skills/deft-directive-gh-arch/SKILL.md +160 -0
- package/skills/deft-directive-gh-slice/SKILL.md +199 -0
- package/skills/deft-directive-glossary/SKILL.md +118 -0
- package/skills/deft-directive-interview/SKILL.md +528 -0
- package/skills/deft-directive-pre-pr/SKILL.md +131 -0
- package/skills/deft-directive-probe/SKILL.md +127 -0
- package/skills/deft-directive-refinement/SKILL.md +403 -0
- package/skills/deft-directive-release/SKILL.md +266 -0
- package/skills/deft-directive-review-cycle/SKILL.md +401 -0
- package/skills/deft-directive-setup/SKILL.md +717 -0
- package/skills/deft-directive-swarm/SKILL.md +989 -0
- package/skills/deft-directive-sync/SKILL.md +288 -0
- package/skills/deft-directive-triage/SKILL.md +137 -0
- package/skills/deft-directive-write-skill/SKILL.md +169 -0
- package/skills/deft-interview/SKILL.md +16 -0
- package/skills/deft-pre-pr/SKILL.md +16 -0
- package/skills/deft-review-cycle/SKILL.md +16 -0
- package/skills/deft-roadmap-refresh/SKILL.md +16 -0
- package/skills/deft-setup/SKILL.md +20 -0
- package/skills/deft-swarm/SKILL.md +16 -0
- package/skills/deft-sync/SKILL.md +16 -0
- package/strategies/README.md +83 -0
- package/strategies/artifact-guards.md +85 -0
- package/strategies/bdd.md +115 -0
- package/strategies/brownfield.md +7 -0
- package/strategies/discuss.md +129 -0
- package/strategies/emit-hints.md +69 -0
- package/strategies/enterprise.md +193 -0
- package/strategies/interview.md +551 -0
- package/strategies/map.md +179 -0
- package/strategies/probe.md +151 -0
- package/strategies/rapid.md +155 -0
- package/strategies/research.md +155 -0
- package/strategies/roadmap.md +9 -0
- package/strategies/speckit.md +437 -0
- package/strategies/v0-20-contract.md +134 -0
- package/strategies/yolo.md +169 -0
- package/swarm/swarm.md +300 -0
- package/templates/COST-ESTIMATE.md +114 -0
- package/templates/PULL_REQUEST_TEMPLATE.md +35 -0
- package/templates/agent-prompt-preamble.md +409 -0
- package/templates/agents-entry.md +211 -0
- package/templates/agents-entry.placeholders.md +75 -0
- package/templates/embed.go +20 -0
- package/templates/embed_test.go +36 -0
- package/templates/make-spec-example.md +9 -0
- package/templates/make-spec.md +246 -0
- package/templates/project.md.template +52 -0
- package/templates/specification.md +1 -0
- package/templates/swarm-greptile-poller-prompt.md +556 -0
- package/templates/user.md.template +31 -0
- package/tools/RWLDL.md +80 -0
- package/tools/greptile.md +141 -0
- package/tools/installer.md +23 -0
- package/tools/taskfile-migration.md +32 -0
- package/tools/taskfile.md +185 -0
- package/tools/telemetry.md +285 -0
- package/vbrief/schemas/cache-meta.schema.json +137 -0
- package/vbrief/schemas/candidates.schema.json +130 -0
- package/vbrief/schemas/codebase-map.schema.json +213 -0
- package/vbrief/schemas/lessons-pack.schema.json +134 -0
- package/vbrief/schemas/patterns-pack.schema.json +84 -0
- package/vbrief/schemas/rules-pack.schema.json +105 -0
- package/vbrief/schemas/skills-pack.schema.json +94 -0
- package/vbrief/schemas/slices.schema.json +87 -0
- package/vbrief/schemas/strategies-pack.schema.json +89 -0
- package/vbrief/schemas/swarm-spec-pack.schema.json +84 -0
- package/vbrief/schemas/vbrief-core.schema.json +1022 -0
- package/vbrief/vbrief.md +684 -0
- package/verification/integration.md +76 -0
- package/verification/plan-checking.md +85 -0
- package/verification/uat.md +60 -0
- package/verification/verification.md +117 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
# Deploy via Dockerfile
|
|
2
|
+
|
|
3
|
+
Deploy any containerized application to Fly.io using custom Dockerfiles. Full control over build process, dependencies, and runtime environment.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Fly.io runs Docker containers, giving you complete flexibility:
|
|
8
|
+
- **Custom Images**: Use any base image
|
|
9
|
+
- **Multi-Stage Builds**: Optimize image size
|
|
10
|
+
- **Build Arguments**: Dynamic build configuration
|
|
11
|
+
- **Layer Caching**: Fast rebuilds
|
|
12
|
+
- **Private Registries**: Pull from your own registry
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- Application with a Dockerfile
|
|
17
|
+
- flyctl CLI installed
|
|
18
|
+
- Docker knowledge (optional for remote builds)
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
### 1. Create a Dockerfile
|
|
23
|
+
|
|
24
|
+
```dockerfile
|
|
25
|
+
# Basic Node.js example
|
|
26
|
+
FROM node:18-alpine
|
|
27
|
+
|
|
28
|
+
WORKDIR /app
|
|
29
|
+
|
|
30
|
+
# Copy package files
|
|
31
|
+
COPY package*.json ./
|
|
32
|
+
|
|
33
|
+
# Install dependencies
|
|
34
|
+
RUN npm ci --production
|
|
35
|
+
|
|
36
|
+
# Copy application code
|
|
37
|
+
COPY . .
|
|
38
|
+
|
|
39
|
+
# Expose port
|
|
40
|
+
EXPOSE 8080
|
|
41
|
+
|
|
42
|
+
# Start application
|
|
43
|
+
CMD ["node", "server.js"]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Deploy
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Deploy using Dockerfile
|
|
50
|
+
fly deploy
|
|
51
|
+
|
|
52
|
+
# Or specify Dockerfile explicitly
|
|
53
|
+
fly deploy --dockerfile Dockerfile
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Dockerfile Best Practices
|
|
57
|
+
|
|
58
|
+
### Multi-Stage Build
|
|
59
|
+
|
|
60
|
+
```dockerfile
|
|
61
|
+
# Build stage
|
|
62
|
+
FROM node:18-alpine AS builder
|
|
63
|
+
|
|
64
|
+
WORKDIR /app
|
|
65
|
+
COPY package*.json ./
|
|
66
|
+
RUN npm ci
|
|
67
|
+
|
|
68
|
+
COPY . .
|
|
69
|
+
RUN npm run build
|
|
70
|
+
|
|
71
|
+
# Production stage
|
|
72
|
+
FROM node:18-alpine
|
|
73
|
+
|
|
74
|
+
WORKDIR /app
|
|
75
|
+
|
|
76
|
+
# Copy only necessary files from builder
|
|
77
|
+
COPY --from=builder /app/dist ./dist
|
|
78
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
79
|
+
COPY package.json ./
|
|
80
|
+
|
|
81
|
+
EXPOSE 8080
|
|
82
|
+
|
|
83
|
+
# Run as non-root user
|
|
84
|
+
USER node
|
|
85
|
+
|
|
86
|
+
CMD ["node", "dist/server.js"]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Layer Caching Optimization
|
|
90
|
+
|
|
91
|
+
```dockerfile
|
|
92
|
+
FROM python:3.11-slim
|
|
93
|
+
|
|
94
|
+
WORKDIR /app
|
|
95
|
+
|
|
96
|
+
# Install dependencies first (cached layer)
|
|
97
|
+
COPY requirements.txt .
|
|
98
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
99
|
+
|
|
100
|
+
# Copy application code last (changes frequently)
|
|
101
|
+
COPY . .
|
|
102
|
+
|
|
103
|
+
CMD ["python", "app.py"]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Minimal Base Images
|
|
107
|
+
|
|
108
|
+
```dockerfile
|
|
109
|
+
# Use distroless for security
|
|
110
|
+
FROM gcr.io/distroless/nodejs18-debian11
|
|
111
|
+
|
|
112
|
+
WORKDIR /app
|
|
113
|
+
|
|
114
|
+
COPY --chown=nonroot:nonroot package*.json ./
|
|
115
|
+
COPY --chown=nonroot:nonroot dist ./dist
|
|
116
|
+
COPY --chown=nonroot:nonroot node_modules ./node_modules
|
|
117
|
+
|
|
118
|
+
EXPOSE 8080
|
|
119
|
+
|
|
120
|
+
USER nonroot
|
|
121
|
+
|
|
122
|
+
CMD ["dist/server.js"]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Language-Specific Examples
|
|
126
|
+
|
|
127
|
+
### Node.js / TypeScript
|
|
128
|
+
|
|
129
|
+
```dockerfile
|
|
130
|
+
FROM node:18-alpine AS builder
|
|
131
|
+
|
|
132
|
+
WORKDIR /app
|
|
133
|
+
|
|
134
|
+
# Install dependencies
|
|
135
|
+
COPY package*.json ./
|
|
136
|
+
RUN npm ci
|
|
137
|
+
|
|
138
|
+
# Build TypeScript
|
|
139
|
+
COPY tsconfig.json ./
|
|
140
|
+
COPY src ./src
|
|
141
|
+
RUN npm run build
|
|
142
|
+
|
|
143
|
+
# Production image
|
|
144
|
+
FROM node:18-alpine
|
|
145
|
+
|
|
146
|
+
WORKDIR /app
|
|
147
|
+
|
|
148
|
+
ENV NODE_ENV=production
|
|
149
|
+
|
|
150
|
+
COPY package*.json ./
|
|
151
|
+
RUN npm ci --production
|
|
152
|
+
|
|
153
|
+
COPY --from=builder /app/dist ./dist
|
|
154
|
+
|
|
155
|
+
EXPOSE 8080
|
|
156
|
+
|
|
157
|
+
USER node
|
|
158
|
+
|
|
159
|
+
CMD ["node", "dist/index.js"]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Python / Django
|
|
163
|
+
|
|
164
|
+
```dockerfile
|
|
165
|
+
FROM python:3.11-slim
|
|
166
|
+
|
|
167
|
+
WORKDIR /app
|
|
168
|
+
|
|
169
|
+
# Install system dependencies
|
|
170
|
+
RUN apt-get update && apt-get install -y \
|
|
171
|
+
postgresql-client \
|
|
172
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
173
|
+
|
|
174
|
+
# Install Python dependencies
|
|
175
|
+
COPY requirements.txt .
|
|
176
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
177
|
+
|
|
178
|
+
# Copy application
|
|
179
|
+
COPY . .
|
|
180
|
+
|
|
181
|
+
# Collect static files
|
|
182
|
+
RUN python manage.py collectstatic --noinput
|
|
183
|
+
|
|
184
|
+
EXPOSE 8000
|
|
185
|
+
|
|
186
|
+
CMD ["gunicorn", "--bind", ":8000", "--workers", "2", "myproject.wsgi:application"]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Go
|
|
190
|
+
|
|
191
|
+
```dockerfile
|
|
192
|
+
# Build stage
|
|
193
|
+
FROM golang:1.21-alpine AS builder
|
|
194
|
+
|
|
195
|
+
WORKDIR /app
|
|
196
|
+
|
|
197
|
+
# Copy go mod files
|
|
198
|
+
COPY go.mod go.sum ./
|
|
199
|
+
RUN go mod download
|
|
200
|
+
|
|
201
|
+
# Copy source
|
|
202
|
+
COPY . .
|
|
203
|
+
|
|
204
|
+
# Build binary
|
|
205
|
+
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
|
|
206
|
+
|
|
207
|
+
# Production stage
|
|
208
|
+
FROM alpine:latest
|
|
209
|
+
|
|
210
|
+
RUN apk --no-cache add ca-certificates
|
|
211
|
+
|
|
212
|
+
WORKDIR /root/
|
|
213
|
+
|
|
214
|
+
COPY --from=builder /app/main .
|
|
215
|
+
|
|
216
|
+
EXPOSE 8080
|
|
217
|
+
|
|
218
|
+
CMD ["./main"]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Ruby / Rails
|
|
222
|
+
|
|
223
|
+
```dockerfile
|
|
224
|
+
FROM ruby:3.2-slim
|
|
225
|
+
|
|
226
|
+
WORKDIR /app
|
|
227
|
+
|
|
228
|
+
# Install dependencies
|
|
229
|
+
RUN apt-get update && apt-get install -y \
|
|
230
|
+
build-essential \
|
|
231
|
+
libpq-dev \
|
|
232
|
+
nodejs \
|
|
233
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
234
|
+
|
|
235
|
+
# Install gems
|
|
236
|
+
COPY Gemfile Gemfile.lock ./
|
|
237
|
+
RUN bundle install --without development test
|
|
238
|
+
|
|
239
|
+
# Copy application
|
|
240
|
+
COPY . .
|
|
241
|
+
|
|
242
|
+
# Precompile assets
|
|
243
|
+
RUN RAILS_ENV=production bundle exec rails assets:precompile
|
|
244
|
+
|
|
245
|
+
EXPOSE 3000
|
|
246
|
+
|
|
247
|
+
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### PHP / Laravel
|
|
251
|
+
|
|
252
|
+
```dockerfile
|
|
253
|
+
FROM php:8.2-fpm-alpine
|
|
254
|
+
|
|
255
|
+
WORKDIR /var/www/html
|
|
256
|
+
|
|
257
|
+
# Install dependencies
|
|
258
|
+
RUN apk add --no-cache \
|
|
259
|
+
nginx \
|
|
260
|
+
postgresql-dev \
|
|
261
|
+
&& docker-php-ext-install pdo pdo_pgsql
|
|
262
|
+
|
|
263
|
+
# Install Composer
|
|
264
|
+
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
|
265
|
+
|
|
266
|
+
# Install PHP dependencies
|
|
267
|
+
COPY composer.json composer.lock ./
|
|
268
|
+
RUN composer install --no-dev --optimize-autoloader
|
|
269
|
+
|
|
270
|
+
# Copy application
|
|
271
|
+
COPY . .
|
|
272
|
+
|
|
273
|
+
# Set permissions
|
|
274
|
+
RUN chown -R www-data:www-data /var/www/html
|
|
275
|
+
|
|
276
|
+
EXPOSE 8080
|
|
277
|
+
|
|
278
|
+
CMD ["php-fpm"]
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Advanced Dockerfile Techniques
|
|
282
|
+
|
|
283
|
+
### Build Arguments
|
|
284
|
+
|
|
285
|
+
```dockerfile
|
|
286
|
+
ARG NODE_VERSION=18
|
|
287
|
+
FROM node:${NODE_VERSION}-alpine
|
|
288
|
+
|
|
289
|
+
ARG BUILD_ENV=production
|
|
290
|
+
ARG API_URL
|
|
291
|
+
|
|
292
|
+
WORKDIR /app
|
|
293
|
+
|
|
294
|
+
COPY package*.json ./
|
|
295
|
+
RUN npm ci --production=${BUILD_ENV}
|
|
296
|
+
|
|
297
|
+
COPY . .
|
|
298
|
+
|
|
299
|
+
# Use build arg in build
|
|
300
|
+
RUN echo "API_URL=${API_URL}" > .env
|
|
301
|
+
|
|
302
|
+
EXPOSE 8080
|
|
303
|
+
|
|
304
|
+
CMD ["node", "server.js"]
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Deploy with build args:
|
|
308
|
+
```bash
|
|
309
|
+
fly deploy --build-arg NODE_VERSION=20 --build-arg API_URL=https://api.example.com
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Health Check
|
|
313
|
+
|
|
314
|
+
```dockerfile
|
|
315
|
+
FROM node:18-alpine
|
|
316
|
+
|
|
317
|
+
WORKDIR /app
|
|
318
|
+
|
|
319
|
+
COPY . .
|
|
320
|
+
|
|
321
|
+
RUN npm ci --production
|
|
322
|
+
|
|
323
|
+
EXPOSE 8080
|
|
324
|
+
|
|
325
|
+
# Add healthcheck
|
|
326
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
327
|
+
CMD node healthcheck.js
|
|
328
|
+
|
|
329
|
+
CMD ["node", "server.js"]
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Multi-Platform Builds
|
|
333
|
+
|
|
334
|
+
```dockerfile
|
|
335
|
+
# Supports both amd64 and arm64
|
|
336
|
+
FROM --platform=$BUILDPLATFORM node:18-alpine AS builder
|
|
337
|
+
|
|
338
|
+
ARG TARGETPLATFORM
|
|
339
|
+
ARG BUILDPLATFORM
|
|
340
|
+
|
|
341
|
+
WORKDIR /app
|
|
342
|
+
|
|
343
|
+
COPY package*.json ./
|
|
344
|
+
RUN npm ci
|
|
345
|
+
|
|
346
|
+
COPY . .
|
|
347
|
+
RUN npm run build
|
|
348
|
+
|
|
349
|
+
FROM node:18-alpine
|
|
350
|
+
|
|
351
|
+
WORKDIR /app
|
|
352
|
+
|
|
353
|
+
COPY --from=builder /app/dist ./dist
|
|
354
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
355
|
+
|
|
356
|
+
EXPOSE 8080
|
|
357
|
+
|
|
358
|
+
CMD ["node", "dist/server.js"]
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Caching Node Modules
|
|
362
|
+
|
|
363
|
+
```dockerfile
|
|
364
|
+
FROM node:18-alpine
|
|
365
|
+
|
|
366
|
+
WORKDIR /app
|
|
367
|
+
|
|
368
|
+
# Copy package files first
|
|
369
|
+
COPY package*.json ./
|
|
370
|
+
|
|
371
|
+
# This layer will be cached unless package.json changes
|
|
372
|
+
RUN npm ci --production
|
|
373
|
+
|
|
374
|
+
# Copy rest of application
|
|
375
|
+
COPY . .
|
|
376
|
+
|
|
377
|
+
EXPOSE 8080
|
|
378
|
+
|
|
379
|
+
CMD ["node", "server.js"]
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
## fly.toml Configuration
|
|
383
|
+
|
|
384
|
+
### Specify Dockerfile
|
|
385
|
+
|
|
386
|
+
```toml
|
|
387
|
+
app = "my-app"
|
|
388
|
+
primary_region = "iad"
|
|
389
|
+
|
|
390
|
+
[build]
|
|
391
|
+
dockerfile = "Dockerfile"
|
|
392
|
+
ignorefile = ".dockerignore"
|
|
393
|
+
|
|
394
|
+
# Build arguments
|
|
395
|
+
[build.args]
|
|
396
|
+
NODE_ENV = "production"
|
|
397
|
+
API_VERSION = "v2"
|
|
398
|
+
|
|
399
|
+
[[services]]
|
|
400
|
+
internal_port = 8080
|
|
401
|
+
protocol = "tcp"
|
|
402
|
+
|
|
403
|
+
[[services.ports]]
|
|
404
|
+
handlers = ["http"]
|
|
405
|
+
port = 80
|
|
406
|
+
|
|
407
|
+
[[services.ports]]
|
|
408
|
+
handlers = ["tls", "http"]
|
|
409
|
+
port = 443
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Use Different Dockerfiles
|
|
413
|
+
|
|
414
|
+
```toml
|
|
415
|
+
# fly.production.toml
|
|
416
|
+
[build]
|
|
417
|
+
dockerfile = "Dockerfile.production"
|
|
418
|
+
|
|
419
|
+
# fly.staging.toml
|
|
420
|
+
[build]
|
|
421
|
+
dockerfile = "Dockerfile.staging"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Deploy:
|
|
425
|
+
```bash
|
|
426
|
+
fly deploy --config fly.production.toml
|
|
427
|
+
fly deploy --config fly.staging.toml
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
## .dockerignore
|
|
431
|
+
|
|
432
|
+
Create `.dockerignore` to exclude unnecessary files:
|
|
433
|
+
|
|
434
|
+
```dockerignore
|
|
435
|
+
# Version control
|
|
436
|
+
.git
|
|
437
|
+
.gitignore
|
|
438
|
+
|
|
439
|
+
# Dependencies
|
|
440
|
+
node_modules
|
|
441
|
+
vendor
|
|
442
|
+
|
|
443
|
+
# Build artifacts
|
|
444
|
+
dist
|
|
445
|
+
build
|
|
446
|
+
*.log
|
|
447
|
+
|
|
448
|
+
# Environment files
|
|
449
|
+
.env
|
|
450
|
+
.env.local
|
|
451
|
+
.env.*.local
|
|
452
|
+
|
|
453
|
+
# IDE
|
|
454
|
+
.vscode
|
|
455
|
+
.idea
|
|
456
|
+
*.swp
|
|
457
|
+
|
|
458
|
+
# OS
|
|
459
|
+
.DS_Store
|
|
460
|
+
Thumbs.db
|
|
461
|
+
|
|
462
|
+
# Documentation
|
|
463
|
+
*.md
|
|
464
|
+
docs/
|
|
465
|
+
|
|
466
|
+
# Tests
|
|
467
|
+
tests/
|
|
468
|
+
*.test.js
|
|
469
|
+
coverage/
|
|
470
|
+
|
|
471
|
+
# CI/CD
|
|
472
|
+
.github
|
|
473
|
+
.gitlab-ci.yml
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
## Build Optimization
|
|
477
|
+
|
|
478
|
+
### Remote Builds (Recommended)
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
# Build on Fly's infrastructure (no local Docker needed)
|
|
482
|
+
fly deploy --remote-only
|
|
483
|
+
|
|
484
|
+
# Faster, uses Fly's build cache
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Local Builds
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
# Build locally with Docker
|
|
491
|
+
fly deploy --local-only
|
|
492
|
+
|
|
493
|
+
# Useful for testing Dockerfile changes
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Build with Cache
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
# Use build cache
|
|
500
|
+
fly deploy --remote-only
|
|
501
|
+
|
|
502
|
+
# Clear cache and rebuild
|
|
503
|
+
fly deploy --remote-only --no-cache
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
## Deploying Pre-Built Images
|
|
507
|
+
|
|
508
|
+
### From Docker Hub
|
|
509
|
+
|
|
510
|
+
```bash
|
|
511
|
+
fly deploy --image nginx:latest
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### From Private Registry
|
|
515
|
+
|
|
516
|
+
```toml
|
|
517
|
+
# fly.toml
|
|
518
|
+
[build]
|
|
519
|
+
image = "registry.example.com/my-app:v1.2.3"
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
```bash
|
|
523
|
+
# Deploy
|
|
524
|
+
fly deploy
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### With Registry Authentication
|
|
528
|
+
|
|
529
|
+
```bash
|
|
530
|
+
# Set registry credentials
|
|
531
|
+
fly secrets set DOCKER_REGISTRY_TOKEN=your-token
|
|
532
|
+
|
|
533
|
+
# Deploy from private registry
|
|
534
|
+
fly deploy --image registry.example.com/my-app:latest
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
## Debugging Docker Builds
|
|
538
|
+
|
|
539
|
+
### Build Locally for Testing
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
# Build Docker image locally
|
|
543
|
+
docker build -t my-app .
|
|
544
|
+
|
|
545
|
+
# Test locally
|
|
546
|
+
docker run -p 8080:8080 my-app
|
|
547
|
+
|
|
548
|
+
# Then deploy to Fly
|
|
549
|
+
fly deploy --local-only
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### View Build Logs
|
|
553
|
+
|
|
554
|
+
```bash
|
|
555
|
+
# Deploy with verbose output
|
|
556
|
+
fly deploy --verbose
|
|
557
|
+
|
|
558
|
+
# View build logs
|
|
559
|
+
fly logs --timestamps
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### SSH into Running Container
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
# Access running container
|
|
566
|
+
fly ssh console
|
|
567
|
+
|
|
568
|
+
# Check environment
|
|
569
|
+
fly ssh console -C "env"
|
|
570
|
+
|
|
571
|
+
# Inspect filesystem
|
|
572
|
+
fly ssh console -C "ls -la"
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
## Common Issues & Solutions
|
|
576
|
+
|
|
577
|
+
### Large Image Size
|
|
578
|
+
|
|
579
|
+
```dockerfile
|
|
580
|
+
# Before: 1GB+
|
|
581
|
+
FROM node:18
|
|
582
|
+
COPY . .
|
|
583
|
+
RUN npm install
|
|
584
|
+
|
|
585
|
+
# After: ~100MB
|
|
586
|
+
FROM node:18-alpine AS builder
|
|
587
|
+
COPY package*.json ./
|
|
588
|
+
RUN npm ci --production
|
|
589
|
+
COPY . .
|
|
590
|
+
|
|
591
|
+
FROM node:18-alpine
|
|
592
|
+
COPY --from=builder /app ./
|
|
593
|
+
CMD ["node", "index.js"]
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
### Slow Builds
|
|
597
|
+
|
|
598
|
+
```dockerfile
|
|
599
|
+
# Order matters! Put stable layers first
|
|
600
|
+
|
|
601
|
+
# ❌ Bad: Code changes rebuild dependencies
|
|
602
|
+
FROM node:18-alpine
|
|
603
|
+
COPY . .
|
|
604
|
+
RUN npm install
|
|
605
|
+
|
|
606
|
+
# ✅ Good: Dependencies cached
|
|
607
|
+
FROM node:18-alpine
|
|
608
|
+
COPY package*.json ./
|
|
609
|
+
RUN npm ci
|
|
610
|
+
COPY . .
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
### Permission Errors
|
|
614
|
+
|
|
615
|
+
```dockerfile
|
|
616
|
+
# Run as non-root user
|
|
617
|
+
FROM node:18-alpine
|
|
618
|
+
|
|
619
|
+
WORKDIR /app
|
|
620
|
+
|
|
621
|
+
# Change ownership
|
|
622
|
+
COPY --chown=node:node . .
|
|
623
|
+
|
|
624
|
+
# Switch to node user
|
|
625
|
+
USER node
|
|
626
|
+
|
|
627
|
+
CMD ["node", "server.js"]
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## Best Practices Summary
|
|
631
|
+
|
|
632
|
+
1. **Use Multi-Stage Builds**: Reduce final image size
|
|
633
|
+
2. **Order Layers Wisely**: Put changing content last
|
|
634
|
+
3. **Use Alpine Images**: Smaller, faster deployments
|
|
635
|
+
4. **Run as Non-Root**: Better security
|
|
636
|
+
5. **Include .dockerignore**: Faster builds, smaller context
|
|
637
|
+
6. **Use Build Cache**: Leverage layer caching
|
|
638
|
+
7. **Health Checks**: Add HEALTHCHECK instruction
|
|
639
|
+
8. **Environment Variables**: Use fly secrets, not hardcoded in Dockerfile
|
|
640
|
+
9. **Remote Builds**: Use `--remote-only` for Fly's build cache
|
|
641
|
+
10. **Pin Versions**: Specify exact versions for reproducibility
|
|
642
|
+
|
|
643
|
+
## References
|
|
644
|
+
|
|
645
|
+
- [Fly.io Docker Deployment](https://fly.io/docs/languages-and-frameworks/dockerfile/)
|
|
646
|
+
- [Docker Best Practices](https://docs.docker.com/develop/dev-best-practices/)
|
|
647
|
+
- [Multi-Stage Builds](https://docs.docker.com/build/building/multi-stage/)
|
|
648
|
+
- [Dockerfile Reference](https://docs.docker.com/engine/reference/builder/)
|