mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 16:37:34 +00:00
Update Grafana to v13, add version notes
This commit is contained in:
@@ -82,6 +82,7 @@ RUN pwd # 输出 /app
|
||||
|
||||
```docker
|
||||
## 构建阶段
|
||||
## 建议使用 node:20 或 node: 等具体版本标签,避免使用 latest
|
||||
|
||||
FROM node:20 AS builder
|
||||
WORKDIR /build
|
||||
@@ -91,6 +92,7 @@ COPY . .
|
||||
RUN npm run build
|
||||
|
||||
## 生产阶段
|
||||
## 建议使用 nginx:alpine 或其他具体版本
|
||||
|
||||
FROM nginx:alpine
|
||||
WORKDIR /usr/share/nginx/html
|
||||
@@ -103,6 +105,7 @@ COPY --from=builder /build/dist .
|
||||
#### 1. 尽早设置 WORKDIR
|
||||
|
||||
```docker
|
||||
# 建议使用 node:20 等主/次版本号标签
|
||||
FROM node:20
|
||||
WORKDIR /app # 尽早设置
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ Starting ──成功──> Healthy ──失败N次──> Unhealthy
|
||||
#### Web 服务检查
|
||||
|
||||
```docker
|
||||
# 注:nginx 镜像推荐使用具体的版本标签(如 nginx:1.25-alpine)
|
||||
FROM nginx
|
||||
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ server {
|
||||
第一阶段进行前端构建。
|
||||
|
||||
```docker
|
||||
# 注:node 镜像推荐使用具体的版本标签(如 node:20-alpine)
|
||||
FROM node:alpine as frontend
|
||||
|
||||
COPY package.json /app/
|
||||
@@ -81,6 +82,7 @@ RUN set -x ; cd /app \
|
||||
第二阶段安装 Composer 依赖。
|
||||
|
||||
```docker
|
||||
# 注:composer 镜像推荐使用具体的版本标签(如 composer:2.x)
|
||||
FROM composer as composer
|
||||
|
||||
COPY database/ /app/database/
|
||||
@@ -101,6 +103,7 @@ RUN set -x ; cd /app \
|
||||
第三阶段对以上阶段生成的文件进行整合。
|
||||
|
||||
```docker
|
||||
# 注:php 镜像版本号已包含 major.minor(8.3),生产环境可根据需要调整
|
||||
FROM php:8.3-fpm-alpine as laravel
|
||||
|
||||
ARG LARAVEL_PATH=/app/laravel
|
||||
@@ -125,6 +128,7 @@ RUN set -x ; cd ${LARAVEL_PATH} \
|
||||
### 7.18.5 最后一个阶段构建 NGINX 镜像
|
||||
|
||||
```docker
|
||||
# 注:nginx 镜像推荐使用具体的版本标签(如 nginx:1.25-alpine)
|
||||
FROM nginx:alpine as nginx
|
||||
|
||||
ARG LARAVEL_PATH=/app/laravel
|
||||
@@ -175,6 +179,7 @@ $ docker run -dit --rm --network=laravel -p 8080:80 my/nginx
|
||||
完整的 `Dockerfile` 文件如下。
|
||||
|
||||
```docker
|
||||
# 注:生产环境推荐使用具体的版本标签,如 node:20-alpine、composer:2.x、php:8.3-fpm-alpine、nginx:1.25-alpine
|
||||
FROM node:alpine as frontend
|
||||
|
||||
COPY package.json /app/
|
||||
@@ -225,6 +230,7 @@ RUN set -x ; cd ${LARAVEL_PATH} \
|
||||
&& php artisan package:discover
|
||||
|
||||
FROM nginx:alpine as nginx
|
||||
```
|
||||
|
||||
ARG LARAVEL_PATH=/app/laravel
|
||||
|
||||
|
||||
@@ -164,6 +164,7 @@ curl -s http://myip.ipip.net -i
|
||||
#### 实现方式
|
||||
|
||||
```docker
|
||||
# 建议使用 redis:7 或 redis:latest,具体版本号根据生产需求选择
|
||||
FROM redis:7-alpine
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
@@ -216,6 +217,7 @@ docker-entrypoint.sh redis-server docker-entrypoint.sh bash
|
||||
### 7.5.6 场景三:带参数的应用
|
||||
|
||||
```docker
|
||||
# 建议使用 python:3.12 或 python:3,具体版本号根据应用兼容性需求选择
|
||||
FROM python:3.12-slim
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
@@ -18,14 +18,14 @@ ENV <key1>=<value1> <key2>=<value2> ...
|
||||
#### 设置单个变量
|
||||
|
||||
```docker
|
||||
ENV NODE_VERSION 20.10.0
|
||||
ENV NODE_VERSION 20
|
||||
ENV APP_ENV production
|
||||
```
|
||||
|
||||
#### 设置多个变量
|
||||
|
||||
```docker
|
||||
ENV NODE_VERSION=20.10.0 \
|
||||
ENV NODE_VERSION=20 \
|
||||
APP_ENV=production \
|
||||
APP_NAME="My Application"
|
||||
```
|
||||
@@ -158,15 +158,15 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
|
||||
```docker
|
||||
## ✅ 好:版本集中管理
|
||||
|
||||
ENV NGINX_VERSION=1.25.0 \
|
||||
NODE_VERSION=20.10.0 \
|
||||
PYTHON_VERSION=3.12.0
|
||||
ENV NGINX_VERSION=1.25 \
|
||||
NODE_VERSION=20 \
|
||||
PYTHON_VERSION=3.12
|
||||
|
||||
RUN apt-get install nginx=${NGINX_VERSION}
|
||||
|
||||
## ❌ 差:版本分散在各处
|
||||
|
||||
RUN apt-get install nginx=1.25.0
|
||||
RUN apt-get install nginx=1.25
|
||||
```
|
||||
|
||||
#### 2. 不要存储敏感信息
|
||||
|
||||
@@ -35,6 +35,7 @@ ARG <参数名>[=<默认值>]
|
||||
|
||||
```docker
|
||||
## 定义有默认值的 ARG
|
||||
## 建议使用主版本号,如 20 而非 20.10.0,这样可以自动获取最新的补丁版本
|
||||
|
||||
ARG NODE_VERSION=20
|
||||
|
||||
@@ -113,17 +114,19 @@ RUN echo "Running with Node $NODE_VERSION"
|
||||
#### 1. 控制基础镜像版本
|
||||
|
||||
```docker
|
||||
ARG ALPINE_VERSION=3.19
|
||||
# 推荐使用主版本号(如 3),或指定次版本号(如 3.19),避免指定完整补丁版本
|
||||
ARG ALPINE_VERSION=3
|
||||
FROM alpine:${ALPINE_VERSION}
|
||||
```
|
||||
```bash
|
||||
$ docker build --build-arg ALPINE_VERSION=3.18 .
|
||||
$ docker build --build-arg ALPINE_VERSION=3.19 .
|
||||
```
|
||||
|
||||
#### 2. 设置软件版本
|
||||
|
||||
```docker
|
||||
ARG NGINX_VERSION=1.25.0
|
||||
# 使用次版本号 (1.25) 而非完整版本号 (1.25.0),以便自动更新到最新补丁版本
|
||||
ARG NGINX_VERSION=1.25
|
||||
|
||||
RUN curl -fsSL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -xz
|
||||
```
|
||||
@@ -197,7 +200,7 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
|
||||
#### 1. 为 ARG 提供合理默认值
|
||||
|
||||
```docker
|
||||
## ✅ 好:有默认值
|
||||
## ✅ 好:有默认值,建议使用主或次版本号而非完整版本号
|
||||
|
||||
ARG NODE_VERSION=20
|
||||
|
||||
@@ -222,12 +225,13 @@ RUN echo "password=$DB_PASSWORD" > /app/.env
|
||||
#### 3. 使用 ARG 提高构建灵活性
|
||||
|
||||
```docker
|
||||
# 推荐使用次版本号标签,允许Docker自动拉取最新的补丁版本
|
||||
ARG BASE_IMAGE=python:3.12-slim
|
||||
FROM ${BASE_IMAGE}
|
||||
|
||||
## 可以构建不同基础镜像的版本
|
||||
|
||||
## docker build --build-arg BASE_IMAGE=python:3.14-alpine .
|
||||
## docker build --build-arg BASE_IMAGE=python:3-slim .
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
@@ -120,6 +120,7 @@ VOLUME /data
|
||||
#### 数据库持久化
|
||||
|
||||
```docker
|
||||
# 建议使用 postgres:16 或 postgres:latest,具体版本号根据数据库兼容性需求选择
|
||||
FROM postgres:16
|
||||
VOLUME /var/lib/postgresql/data
|
||||
```
|
||||
@@ -173,6 +174,7 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
```yaml
|
||||
services:
|
||||
db:
|
||||
# 建议使用 postgres:16 或其他具体版本,避免 latest
|
||||
image: postgres:16
|
||||
volumes:
|
||||
# 命名卷(推荐)
|
||||
|
||||
+12
-1
@@ -72,6 +72,17 @@ docker build [选项] <上下文路径/URL/->
|
||||
例如,在 Dockerfile 所在目录执行:
|
||||
|
||||
```bash
|
||||
docker build -t my-image:v1 .
|
||||
docker build -t my-image:1.0 .
|
||||
```
|
||||
|
||||
### 关于版本号最佳实践
|
||||
|
||||
本章中的 Dockerfile 示例使用的基础镜像标签遵循以下原则:
|
||||
|
||||
- **通用标签**(如 `ubuntu:24.04`、`alpine`、`nginx`):保持原样,无需修改
|
||||
- **基础镜像版本号**(如 `node:20`、`python:3.12`):使用主或次版本号而非完整版本号(patch),这样可以自动获取最新的补丁版本,确保获得安全更新
|
||||
- **避免**:不建议使用 `latest` 标签和完整的 patch 版本号(如 `20.10.0`)作为基础镜像,因为这会导致构建的不可重现性或安全风险
|
||||
|
||||
读者在使用这些示例时,应根据实际生产环境需求选择合适的版本号。
|
||||
|
||||
更多关于 `docker build` 的用法,我们在实战中会结合具体指令进行演示。
|
||||
|
||||
Reference in New Issue
Block a user