mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-06-07 17:33:36 +03:00
Workflows: Refactor docker (#4738)
* Workflows: Rewrite Docker image build process * Docker: Merge Multi-Arch Manifests
This commit is contained in:
parent
d0c80fc80d
commit
d44c78b819
71
.github/docker/Dockerfile
vendored
71
.github/docker/Dockerfile
vendored
@ -1,28 +1,61 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:latest
|
||||||
FROM --platform=$BUILDPLATFORM golang:alpine AS build
|
FROM --platform=$BUILDPLATFORM golang:latest AS build
|
||||||
|
|
||||||
|
# Build xray-core
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
COPY . .
|
COPY . .
|
||||||
ARG TARGETOS
|
ARG TARGETOS
|
||||||
ARG TARGETARCH
|
ARG TARGETARCH
|
||||||
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH CGO_ENABLED=0 go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
|
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH CGO_ENABLED=0 go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
|
||||||
ADD https://github.com/v2fly/geoip/releases/latest/download/geoip.dat /v2fly/geoip.dat
|
|
||||||
ADD https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat /v2fly/geosite.dat
|
|
||||||
ADD https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat /loyalsoldier/geoip.dat
|
|
||||||
ADD https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat /loyalsoldier/geosite.dat
|
|
||||||
|
|
||||||
# chainguard/static contains only tzdata and ca-certificates, can be built with multiarch static binaries.
|
# Download geodat into a staging directory
|
||||||
FROM --platform=linux/amd64 chainguard/static:latest
|
ADD https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geoip.dat /tmp/geodat/geoip.dat
|
||||||
WORKDIR /var/log/xray
|
ADD https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geosite.dat /tmp/geodat/geosite.dat
|
||||||
COPY .github/docker/files/config.json /etc/xray/config.json
|
|
||||||
COPY --from=build --chmod=755 /src/xray /usr/bin/xray
|
|
||||||
|
|
||||||
USER root
|
RUN mkdir -p /tmp/empty
|
||||||
WORKDIR /root
|
|
||||||
VOLUME /etc/xray
|
# Create config files with empty JSON content
|
||||||
ARG TZ=Asia/Shanghai
|
RUN mkdir -p /tmp/usr/local/etc/xray
|
||||||
|
RUN cat <<EOF >/tmp/usr/local/etc/xray/00_log.json
|
||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"error": "/var/log/xray/error.log",
|
||||||
|
"loglevel": "warning",
|
||||||
|
"access": "none",
|
||||||
|
"dnsLog": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/01_api.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/02_dns.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/03_routing.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/04_policy.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/05_inbounds.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/06_outbounds.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/07_transport.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/08_stats.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/09_reverse.json
|
||||||
|
|
||||||
|
# Create log files
|
||||||
|
RUN mkdir -p /tmp/var/log/xray && touch \
|
||||||
|
/tmp/var/log/xray/access.log \
|
||||||
|
/tmp/var/log/xray/error.log
|
||||||
|
|
||||||
|
# Build finally image
|
||||||
|
FROM gcr.io/distroless/static:nonroot
|
||||||
|
|
||||||
|
COPY --from=build --chown=0:0 --chmod=755 /src/xray /usr/local/bin/xray
|
||||||
|
COPY --from=build --chown=0:0 --chmod=644 /tmp/geodat/*.dat /usr/local/share/xray/
|
||||||
|
COPY --from=build --chown=0:0 --chmod=755 /tmp/empty /usr/local/etc/xray
|
||||||
|
COPY --from=build --chown=0:0 --chmod=644 /tmp/usr/local/etc/xray/*.json /usr/local/etc/xray/
|
||||||
|
COPY --from=build --chown=0:0 --chmod=755 /tmp/empty /var/log/xray
|
||||||
|
COPY --from=build --chown=65532:65532 --chmod=600 /tmp/var/log/xray/*.log /var/log/xray/
|
||||||
|
|
||||||
|
VOLUME /usr/local/etc/xray
|
||||||
|
VOLUME /var/log/xray
|
||||||
|
|
||||||
|
ARG TZ=Etc/UTC
|
||||||
ENV TZ=$TZ
|
ENV TZ=$TZ
|
||||||
ENTRYPOINT [ "/usr/bin/xray" ]
|
|
||||||
CMD [ "-confdir", "/etc/xray/" ]
|
|
||||||
|
|
||||||
ARG flavor=v2fly
|
ENTRYPOINT [ "/usr/local/bin/xray" ]
|
||||||
COPY --from=build --chmod=644 /$flavor /usr/share/xray
|
CMD [ "-confdir", "/usr/local/etc/xray/" ]
|
||||||
|
70
.github/docker/Dockerfile.usa
vendored
Normal file
70
.github/docker/Dockerfile.usa
vendored
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# syntax=docker/dockerfile:latest
|
||||||
|
FROM --platform=$BUILDPLATFORM golang:latest AS build
|
||||||
|
|
||||||
|
# Build xray-core
|
||||||
|
WORKDIR /src
|
||||||
|
COPY . .
|
||||||
|
ARG TARGETOS
|
||||||
|
ARG TARGETARCH
|
||||||
|
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH CGO_ENABLED=0 go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
|
||||||
|
|
||||||
|
# Download geodat into a staging directory
|
||||||
|
ADD https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geoip.dat /tmp/geodat/geoip.dat
|
||||||
|
ADD https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geosite.dat /tmp/geodat/geosite.dat
|
||||||
|
|
||||||
|
RUN mkdir -p /tmp/empty
|
||||||
|
|
||||||
|
# Create config files with empty JSON content
|
||||||
|
RUN mkdir -p /tmp/usr/local/etc/xray
|
||||||
|
RUN cat <<EOF >/tmp/usr/local/etc/xray/00_log.json
|
||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"error": "/var/log/xray/error.log",
|
||||||
|
"loglevel": "warning",
|
||||||
|
"access": "none",
|
||||||
|
"dnsLog": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/01_api.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/02_dns.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/03_routing.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/04_policy.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/05_inbounds.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/06_outbounds.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/07_transport.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/08_stats.json
|
||||||
|
RUN echo '{}' >/tmp/usr/local/etc/xray/09_reverse.json
|
||||||
|
|
||||||
|
# Create log files
|
||||||
|
RUN mkdir -p /tmp/var/log/xray && touch \
|
||||||
|
/tmp/var/log/xray/access.log \
|
||||||
|
/tmp/var/log/xray/error.log
|
||||||
|
|
||||||
|
# Build finally image
|
||||||
|
# Note on Distroless Base Image and Architecture Support:
|
||||||
|
# - The official 'gcr.io/distroless/static' image provided by Google only supports a limited set of architectures for Linux:
|
||||||
|
# - linux/amd64
|
||||||
|
# - linux/arm/v7
|
||||||
|
# - linux/arm64/v8
|
||||||
|
# - linux/ppc64le
|
||||||
|
# - linux/s390x
|
||||||
|
# - Upon inspection, the blob contents of the Distroless images across these architectures are nearly identical, with only minor differences in metadata (e.g., 'Architecture' field in the manifest).
|
||||||
|
# - Due to this similarity in content, it is feasible to forcibly specify a single platform (e.g., '--platform=linux/amd64') for unsupported architectures, as the core image content remains compatible with statically compiled binaries like Go applications.
|
||||||
|
FROM --platform=linux/amd64 gcr.io/distroless/static:nonroot
|
||||||
|
|
||||||
|
COPY --from=build --chown=0:0 --chmod=755 /src/xray /usr/local/bin/xray
|
||||||
|
COPY --from=build --chown=0:0 --chmod=644 /tmp/geodat/*.dat /usr/local/share/xray/
|
||||||
|
COPY --from=build --chown=0:0 --chmod=755 /tmp/empty /usr/local/etc/xray
|
||||||
|
COPY --from=build --chown=0:0 --chmod=644 /tmp/usr/local/etc/xray/*.json /usr/local/etc/xray/
|
||||||
|
COPY --from=build --chown=0:0 --chmod=755 /tmp/empty /var/log/xray
|
||||||
|
COPY --from=build --chown=65532:65532 --chmod=600 /tmp/var/log/xray/*.log /var/log/xray/
|
||||||
|
|
||||||
|
VOLUME /usr/local/etc/xray
|
||||||
|
VOLUME /var/log/xray
|
||||||
|
|
||||||
|
ARG TZ=Etc/UTC
|
||||||
|
ENV TZ=$TZ
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/usr/local/bin/xray" ]
|
||||||
|
CMD [ "-confdir", "/usr/local/etc/xray/" ]
|
18
.github/docker/files/config.json
vendored
18
.github/docker/files/config.json
vendored
@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"inbounds": [{
|
|
||||||
"port": 9000,
|
|
||||||
"protocol": "vmess",
|
|
||||||
"settings": {
|
|
||||||
"clients": [
|
|
||||||
{
|
|
||||||
"id": "1eb6e917-774b-4a84-aff6-b058577c60a5",
|
|
||||||
"level": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
"outbounds": [{
|
|
||||||
"protocol": "freedom",
|
|
||||||
"settings": {}
|
|
||||||
}]
|
|
||||||
}
|
|
61
.github/workflows/docker.yml
vendored
61
.github/workflows/docker.yml
vendored
@ -3,9 +3,6 @@ name: Build docker image
|
|||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-image:
|
build-image:
|
||||||
@ -14,6 +11,7 @@ jobs:
|
|||||||
packages: write
|
packages: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Docker metadata
|
- name: Docker metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
@ -21,56 +19,73 @@ jobs:
|
|||||||
images: ghcr.io/${{ github.repository_owner }}/xray-core
|
images: ghcr.io/${{ github.repository_owner }}/xray-core
|
||||||
flavor: latest=auto
|
flavor: latest=auto
|
||||||
tags: |
|
tags: |
|
||||||
type=sha
|
|
||||||
type=ref,event=branch
|
|
||||||
type=ref,event=pr
|
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
- name: Docker metadata Loyalsoldier flavor
|
|
||||||
id: loyalsoldier
|
- name: Docker metadata (unsupported architectures)
|
||||||
|
id: metausa
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
with:
|
with:
|
||||||
images: ghcr.io/${{ github.repository_owner }}/xray-core
|
images: ghcr.io/${{ github.repository_owner }}/xray-core
|
||||||
flavor: |
|
flavor: |
|
||||||
latest=auto
|
latest=auto
|
||||||
suffix=-ls,onlatest=true
|
suffix=-usa,onlatest=true
|
||||||
tags: |
|
tags: |
|
||||||
type=sha
|
|
||||||
type=ref,event=branch
|
|
||||||
type=ref,event=pr
|
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: |
|
platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm/v7
|
||||||
linux/loong64
|
linux/arm64/v8
|
||||||
linux/riscv64
|
linux/ppc64le
|
||||||
|
linux/s390x
|
||||||
provenance: false
|
provenance: false
|
||||||
file: .github/docker/Dockerfile
|
file: .github/docker/Dockerfile
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
- name: Build and push Loyalsoldier flavor
|
|
||||||
|
- name: Build and push (unsupported architectures)
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: |
|
platforms: |
|
||||||
linux/amd64
|
linux/386
|
||||||
linux/arm64
|
linux/arm/v6
|
||||||
linux/loong64
|
|
||||||
linux/riscv64
|
linux/riscv64
|
||||||
|
linux/loong64
|
||||||
provenance: false
|
provenance: false
|
||||||
file: .github/docker/Dockerfile
|
file: .github/docker/Dockerfile.usa
|
||||||
build-args: flavor=loyalsoldier
|
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: ${{ steps.metausa.outputs.tags }}
|
||||||
${{ steps.loyalsoldier.outputs.tags }}
|
|
||||||
|
- name: Merge Multi-Arch Manifests
|
||||||
|
run: |
|
||||||
|
echo "Starting to merge multi-architecture manifests..."
|
||||||
|
|
||||||
|
# Convert newlines to spaces and split into array
|
||||||
|
TAGS=($(echo "${{ steps.meta.outputs.tags }}" | tr '\n' ' '))
|
||||||
|
|
||||||
|
echo "Total tags to process: ${#TAGS[@]}"
|
||||||
|
for tag in "${TAGS[@]}"; do
|
||||||
|
echo "Merging tag: $tag with unsupported architectures ($tag-usa)"
|
||||||
|
docker buildx imagetools create --append --tag "$tag" "$tag-usa"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: Failed to merge $tag-usa into $tag"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Multi-architecture manifest merge completed successfully."
|
||||||
|
Loading…
x
Reference in New Issue
Block a user