易君召
易君召
发布于 2026-07-16 / 11 阅读
0
0

项目代码推送私有 Docker 仓库 + Dockerfile 完整落地方案

分三大部分说明:

  1. Dockerfile 编写(把本地业务代码打包进镜像)

  2. 构建镜像、推送到私服完整命令流程

  3. 私服认证、常见踩坑(私有仓库 http/https、内网地址)

一、通用 Dockerfile 模板(分 Java/SpringBoot、Vue 前端、Go 三种主流业务)

场景 1:Java SpringBoot(最常用)

项目结构示例

项目根目录
├── Dockerfile
├── target
│   └── demo.jar  # mvn clean package打包产物
└── src

Dockerfile

# 基础JDK镜像(推荐私有仓库镜像,避免拉取外网)
FROM 192.168.1.100:8082/library/openjdk:17-jre-slim

# 设置工作目录
WORKDIR /app

# 复制本地业务jar包到容器内
COPY target/demo.jar app.jar

# 容器启动命令
ENTRYPOINT ["java","-jar","app.jar"]

# 暴露服务端口
EXPOSE 8080

场景 2:Vue/React 前端(Node 打包产物 dist)

# 私有仓库nginx基础镜像
FROM 192.168.1.100:8082/library/nginx:alpine

WORKDIR /usr/share/nginx/html

# 复制本地打包好的前端代码dist文件夹
COPY dist/ .

# 替换nginx配置(可选)
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

场景 3:Go 后端(二进制产物)

FROM 192.168.1.100:8082/library/alpine:3.19

WORKDIR /app

# 复制本地编译好的go二进制文件
COPY ./app ./app

RUN chmod +x ./app

EXPOSE 8090
CMD ["./app"]

二、关键语法说明:本地业务代码写入镜像核心指令

1. COPY(推荐,本地文件复制到容器)

# 格式:COPY 本地路径(相对Dockerfile) 容器内路径
COPY target/*.jar /app/
COPY dist/ /html/
COPY config/application.yml /app/config/
  • 路径相对 Dockerfile 文件执行构建时的上下文目录

  • 文件夹带 / 代表复制文件夹内所有内容,不带则复制文件夹本身

2. ADD(扩展 COPY,支持压缩包自动解压,业务代码优先用 COPY)

ADD code.tar.gz /app/ # 自动解压tar压缩包

3. .dockerignore(必写,加速构建、减小镜像)

和 Dockerfile 同目录新建 .dockerignore,过滤不需要打进镜像的文件

# java过滤
target/*.original
.git
.idea
logs
tmp
node_modules
*.md

三、构建镜像 + 推送到私有 Docker 私服完整流程

私服地址示例:192.168.1.100:8082 仓库命名规范:私服地址/仓库名/镜像名:版本

步骤 1:登录私有仓库(必须先认证)

# 交互输入账号密码
docker login 192.168.1.100:8082
# 非交互脚本批量构建用
echo "私服密码" | docker login 192.168.1.100:8082 -u 账号 --password-stdin

步骤 2:打包业务代码(以 Java 为例)

mvn clean package -DskipTests

步骤 3:构建镜像,标签直接带上私服地址

# 语法 docker build -t 私服地址/项目仓库/镜像名:版本 .
docker build -t 192.168.1.100:8082/biz/demo-service:v1.0 .

末尾 . 代表构建上下文是当前目录(读取 Dockerfile、本地代码)

步骤 4:推送镜像到私服

docker push 192.168.1.100:8082/biz/demo-service:v1.0

四、内网私服 http 无证书报错解决(常见问题)

私服如果是 http(非 https),Docker 默认拒绝推送,修改 daemon 配置:

  1. 修改 docker 配置 /etc/docker/daemon.json

{
  "insecure-registries": ["192.168.1.100:8082"]
}
  1. 重启 docker

systemctl daemon-reload
systemctl restart docker

五、多阶段构建(推荐!减小镜像体积,本地不用提前打包)

适合 Java/Go,直接在容器内编译业务代码,不用本地编译产物,代码直接写入构建阶段,示例 Java 多阶段:

# 阶段1:编译代码(构建阶段)
FROM 192.168.1.100:8082/library/maven:3.9-openjdk17 AS builder
WORKDIR /build
# 把本地完整业务代码复制进构建容器
COPY . .
# 容器内打包
RUN mvn clean package -DskipTests

# 阶段2:运行镜像(只拷贝jar,无maven源码,镜像极小)
FROM 192.168.1.100:8082/library/openjdk:17-jre-slim
WORKDIR /app
# 从构建阶段拷贝打包好的jar
COPY --from=builder /build/target/demo.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

优势:CI 流水线无需本地打包,代码直接 COPY 进镜像编译,统一环境。

六、CI / 自动化脚本完整示例(一键打包推送私服)

#!/bin/bash
REGISTRY="192.168.1.100:8082"
REPO="biz/demo-service"
TAG="v1.0"

# 1.打包代码
mvn clean package -DskipTests
# 2.构建镜像
docker build -t ${REGISTRY}/${REPO}:${TAG} .
# 3.推送私服
docker push ${REGISTRY}/${REPO}:${TAG}
echo "推送完成:${REGISTRY}/${REPO}:${TAG}"

七、核心注意点

  1. COPY 路径是构建上下文相对路径,docker build 末尾 . 决定上下文根目录;

  2. 镜像 tag 必须包含私服完整地址,否则 push 会推送到 docker.io 公有仓库;

  3. 私有仓库必须先 login 认证,否则 push 返回 401 未授权;

  4. 内网 http 私服务必配置 insecure-registries,否则构建推送失败;

  5. 多阶段构建分离编译与运行环境,镜像体积大幅降低,生产推荐。


原文链接 https://www.yijunzhao.cn/archives/docker-private-registry-push-dockerfile-implementation-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/


评论