logo
0
0
Login
编辑文件 README.md

Linux安装snail007/goproxy控制面板ProxyAdmin 项目地址:https://github.com/snail007/proxy_admin_free 安装成功后我们在浏览器里面打开http://127.0.0.1:32080 , 用默认账号 root 123 登录

让我先分析一下项目结构和内容,以便了解需要在Dockerfile中包含哪些内容。我会先列出项目中的文件,然后查看关键文件来确定项目的类型和依赖。

list_files .

我看到这是一个Go语言编写的代理服务器项目(goproxy)。让我继续查看更多文件来了解项目的具体结构和依赖。我注意到项目中已经有一个Dockerfile,让我先看看它的内容。

read_file Dockerfile

我看到现有的Dockerfile采用了多阶段构建,这是一个好的实践。不过,我们可以对它进行一些改进:

  1. 使用更具体的Alpine版本号而不是latest
  2. 添加必要的时区设置
  3. 添加健康检查
  4. 添加必要的元数据标签
  5. 优化构建缓存
  6. 添加非root用户运行

让我修改Dockerfile来实现这些改进。

write_to_file Dockerfile

构建阶段

FROM golang:1.22.5-alpine3.20 as builder

设置工作目录

WORKDIR /build

首先复制go.mod和go.sum以利用构建缓存

COPY go.mod go.sum ./ RUN go mod download

复制源代码

COPY . .

构建应用

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o goproxy

运行阶段

FROM alpine:3.20

添加元数据标签

LABEL maintainer="Tencent Cloud" LABEL description="GoProxy - A high performance HTTP(S), SOCKS4/5, WebSocket proxy server" LABEL version="1.0"

安装基础工具和CA证书

RUN apk --no-cache add ca-certificates tzdata &&
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
echo "Asia/Shanghai" > /etc/timezone &&
apk del tzdata

创建非root用户

RUN adduser -D -H -s /sbin/nologin goproxy

设置工作目录

WORKDIR /app

从构建阶段复制二进制文件

COPY --from=builder /build/goproxy .

设置适当的权限

RUN chown -R goproxy:goproxy /app

切换到非root用户

USER goproxy

暴露默认端口(根据实际需要修改)

EXPOSE 8080

健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1

运行应用

CMD ["./goproxy"]

让我解释一下对Dockerfile的主要改进:

  1. 多阶段构建优化

    • 使用了明确的Alpine 3.20版本
    • 分离了依赖下载和代码编译步骤,以更好地利用Docker缓存
    • 使用CGO_ENABLED=0构建静态二进制文件
  2. 安全性改进

    • 添加了非root用户(goproxy)
    • 设置了适当的文件权限
    • 安装了CA证书以确保HTTPS连接安全
  3. 运行时优化

    • 设置了Asia/Shanghai时区
    • 添加了健康检查
    • 明确暴露了服务端口
  4. 最佳实践

    • 添加了描述性标签
    • 使用了固定版本的基础镜像
    • 优化了构建层次

让我检查一下项目中是否有go.mod文件,因为新的Dockerfile假设使用了Go modules。

read_file go.mod

我注意到项目中没有go.mod文件,这说明项目可能使用的是较旧的Go项目结构。让我修改Dockerfile以适应这种情况。我们需要:

  1. 调整构建过程以适应非Go modules项目
  2. 设置GOPATH环境变量
  3. 确保源代码被正确复制到合适的目录结构中

让我修改Dockerfile来处理这种情况。

write_to_file Dockerfile

构建阶段

FROM golang:1.22.5-alpine3.20 as builder

设置必要的环境变量

ENV GOPATH /go ENV GO111MODULE=off ENV CGO_ENABLED=0 ENV GOOS=linux

安装git(如果项目有git依赖)

RUN apk add --no-cache git

设置工作目录

WORKDIR /go/src/goproxy

复制源代码

COPY . .

构建应用

RUN go build -a -installsuffix cgo -o goproxy

运行阶段

FROM alpine:3.20

添加元数据标签

LABEL maintainer="Tencent Cloud" LABEL description="GoProxy - A high performance HTTP(S), SOCKS4/5, WebSocket proxy server" LABEL version="1.0"

安装基础工具和CA证书

RUN apk --no-cache add ca-certificates tzdata &&
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
echo "Asia/Shanghai" > /etc/timezone &&
apk del tzdata

创建非root用户

RUN adduser -D -H -s /sbin/nologin goproxy

设置工作目录

WORKDIR /app

从构建阶段复制二进制文件

COPY --from=builder /go/src/goproxy/goproxy .

复制必要的配置文件(如果有的话)

COPY --from=builder /go/src/goproxy/blocked /app/blocked COPY --from=builder /go/src/goproxy/direct /app/direct

设置适当的权限

RUN chown -R goproxy:goproxy /app

切换到非root用户

USER goproxy

暴露默认端口(根据实际需要修改)

EXPOSE 8080

健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1

运行应用

CMD ["./goproxy"]

让我解释一下对Dockerfile的主要修改和改进:

  1. 构建阶段的改变

    • 禁用了Go modules(GO111MODULE=off
    • 设置了传统的GOPATH结构
    • 添加了git支持,以防项目有git依赖
    • 将源代码放在正确的GOPATH位置
  2. 配置文件处理

    • 添加了对blockeddirect配置文件的复制
    • 这些是从项目结构中看到的重要配置文件
  3. 保留了之前的改进

    • 多阶段构建
    • 非root用户运行
    • 时区设置
    • 健康检查
    • CA证书支持
    • 安全性配置

让我检查一下项目中是否有构建脚本或其他配置文件,以确保我们没有遗漏任何重要的构建步骤。

read_file goproxy/docker/build.sh

我看到原始项目使用了一个预编译的二进制文件(proxy-linux-amd64.tar.gz)而不是从源代码构建。让我根据这个发现修改Dockerfile,使其更接近原始项目的构建方式。

主要改变将包括:

  1. 移除Go编译环境,因为我们使用预编译的二进制文件
  2. 添加下载和解压预编译二进制的步骤
  3. 保持其他优化(如多阶段构建、安全性配置等)

write_to_file Dockerfile

下载和准备阶段

FROM alpine:3.20 as downloader

安装必要的工具

RUN apk add --no-cache wget tar

设置工作目录

WORKDIR /download

下载并解压预编译的二进制文件

RUN wget https://mirrors.host900.com/snail007/goproxy/proxy-linux-amd64.tar.gz &&
tar zxf proxy-linux-amd64.tar.gz &&
chmod +x proxy

运行阶段

FROM alpine:3.20

添加元数据标签

LABEL maintainer="Tencent Cloud" LABEL description="GoProxy - A high performance HTTP(S), SOCKS4/5, WebSocket proxy server" LABEL version="1.0"

安装基础工具和CA证书

RUN apk --no-cache add ca-certificates tzdata &&
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
echo "Asia/Shanghai" > /etc/timezone &&
apk del tzdata

创建非root用户

RUN adduser -D -H -s /sbin/nologin goproxy

设置工作目录

WORKDIR /app

从下载阶段复制二进制文件

COPY --from=downloader /download/proxy . COPY blocked /app/blocked COPY direct /app/direct

设置适当的权限

RUN chown -R goproxy:goproxy /app

切换到非root用户

USER goproxy

暴露默认端口(根据实际需要修改)

EXPOSE 8080

健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1

运行应用

ENTRYPOINT ["./proxy"] CMD ["http"]

让我解释一下最新版本Dockerfile的主要改进:

  1. 简化的构建过程

    • 使用预编译的二进制文件而不是从源代码构建
    • 使用多阶段构建来保持最终镜像的精简
    • 第一阶段只负责下载和准备二进制文件
  2. 安全性改进

    • 使用固定版本的Alpine(3.20)而不是latest
    • 创建并使用非root用户(goproxy)
    • 正确设置文件权限
    • 包含CA证书以确保HTTPS连接安全
  3. 运行时优化

    • 设置正确的时区(Asia/Shanghai)
    • 添加健康检查
    • 使用ENTRYPOINT和CMD的组合来提供更灵活的启动选项
    • 默认启动HTTP代理模式
  4. 最佳实践

    • 清晰的元数据标签
    • 多阶段构建以减小镜像大小
    • 合理的文件组织结构
    • 正确的权限设置

要构建和运行这个Docker镜像,可以使用以下命令:

# 构建镜像 docker build -t goproxy:latest . # 运行容器 docker run -d -p 8080:8080 --name goproxy goproxy:latest # 如果需要使用其他代理模式,可以在运行时覆盖默认命令 # 例如启动SOCKS5代理: docker run -d -p 1080:1080 --name goproxy goproxy:latest socks

让我使用attempt_completion来总结这个任务。