skills-ws
Version:
87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.
82 lines (60 loc) • 2.63 kB
Markdown
## Contents
- 4. Secrets Management
- Compose file-based secrets (single host, no Swarm needed)
- Docker secrets (Swarm mode)
- BuildKit secrets (build-time)
- Environment variable security
## 4. Secrets Management
### Compose file-based secrets (single host, no Swarm needed)
The Compose Specification supports `secrets:` on plain `docker compose up` — each secret is mounted **read-only at `/run/secrets/<name>`**, never placed in the environment or `inspect` output. This is what the §3 compose file uses for `db_password`. Prefer this over `environment:` for anything sensitive:
```yaml
services:
app:
secrets:
- db_password # available at /run/secrets/db_password (mode 0444)
secrets:
db_password:
file: ./secrets/db_password.txt # chmod 600, gitignored
# or, to read from the host env instead of a file:
# environment: DB_PASSWORD # Compose Spec >= 2.x
```
In your app, read the file — and prefer the `*_FILE` convention many official images support (`POSTGRES_PASSWORD_FILE`, etc.) so the secret never transits an env var:
```js
const password = fs.readFileSync(process.env.DB_PASSWORD_FILE ?? '/run/secrets/db_password', 'utf8').trim();
```
### Docker secrets (Swarm mode)
```bash
# Create secret from stdin (don't pass it as a CLI arg — args leak via `ps`/history)
printf '%s' "$DB_PASSWORD" | docker secret create db_password -
# Use in service
docker service create --secret db_password myapp
# In container, secret is at /run/secrets/db_password
```
### BuildKit secrets (build-time)
```dockerfile
# Don't bake secrets into layers!
# BAD:
COPY .npmrc /app/.npmrc
RUN npm ci
RUN rm /app/.npmrc # Still in layer history!
# GOOD: BuildKit mount secret
RUN --mount=type=secret,id=npmrc,target=/app/.npmrc npm ci
# Secret never appears in any layer
```
```bash
docker build --secret id=npmrc,src=.npmrc -t myapp .
```
### Environment variable security
```bash
# BAD: secrets in docker-compose.yml or CLI
environment:
- DB_PASSWORD=hunter2 # Visible in docker inspect
# BETTER: env_file (still visible in inspect, but not in source)
env_file:
- .env.production
# BEST: Compose/Swarm secrets + file reading (never in env, never in inspect)
# In your app:
# const password = fs.readFileSync('/run/secrets/db_password', 'utf8').trim();
```
> `env_file:` keeps secrets out of your *source*, but they are still visible to anyone who can run `docker inspect <container>` or read `/proc/<pid>/environ` on the host. Treat env vars as **non-secret config** (ports, feature flags, log level) and route real credentials through file-based secrets above.