Skip to content

Workflows: Refactor docker #4738

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 6, 2025
Merged

Workflows: Refactor docker #4738

merged 2 commits into from
Jun 6, 2025

Conversation

Meo597
Copy link
Contributor

@Meo597 Meo597 commented May 18, 2025

Break changes:

  1. 不再以 root 权限运行:如果你出于任何理由不得不以 root 权限运行(大部分用户不需要,也不建议这么做)
    可以加参数恢复 root 权限,docker run -d --user root

    其它情况比如要监听 < 1024 端口,你应该用容器标准做法:外部映射小端口,内部改用大端口 docker run -d -p 443:8443
    如果你希望得到 udp fullcone 而不得不用 host 网络,你应该 cap net 特权,而不是用 root 用户

  2. 配置文件路径变更:需要注意配置文件权限,默认创建好的文件权限是对的,你可以参考它们的值

  3. 限制了日志文件权限,如果你使用非默认日志文件路径,你必须保证容器内的 uid 65532 可写

  4. -ls 后缀的标签没了,也没啥人用,现在默认已是 ls 的 geodata,如果你之前用 -ls 现在应该删掉


Example:

docker volume create xray_conf
docker volume create xray_log

# 因为运行在非 root 模式,因此内部端口不能小于 1024
docker run -d -p 443:8443 --name xray \
    -v xray_conf:/usr/local/etc/xray \
    -v xray_log:/var/log/xray \
    ghcr.io/xtls/xray-core:latest

# 本示例挂的是卷,因此你需要再另外启一个有 shell 的实例挂载过去才能编辑配置文件、查看日志
docker run -i -t --name xray-console \
    -v xray_conf:/usr/local/etc/xray \
    -v xray_log:/var/log/xray \
    alpine:latest

或者,你也可以在宿主找一个空的目录,这样实例首次启动时会自动创建空的配置文件,并自动处理好文件和目录的权限
注意:如果你的 docker 引擎配了 uidremap,那么你在给宿主目录和文件配权限的时候还得处理映射关系
因此最佳实践是:找个空目录先启动一次,完了再直接 echo 配置到现有的文件上,这可以省掉很多麻烦


解决了现有 docker 映像的这些问题:

  • 目前每当 main 分支有更新就 build 一次,实际上这些根本没人下载
    改成仅 release 时 build image
  • FROM chainguard 要求运行在非 root 用户下,现在破坏了这个设定
  • 配置文件是单个的,而且有默认内容,而且非 root 下不可能支持多文件(nonroot权限导致)
    改成多文件,处理目录和文件权限以支持 nonroot
  • docker.yml 有许多参数相互冲突,比如最开头规定只在 main 分支改动和 release 时运行,但下面又定义 PR 也可运行
    删掉无用的,改为仅 release
  • 默认时区是上海
    改成UTC,因为不只是中国人在用,而且服务器大多在非中国
  • 非 root 下不支持写日志文件(nonroot权限导致),没法持久化,导致销毁实例再建日志会丢
    改为默认写 error,自动创建卷来持久化,处理目录和文件权限以支持 nonroot
  • 各种路径跟 xray-install 脚本不一致
    改为一样的
  • 最终 image 全部都基于 chainguard/stable:amd64,实际上是应该分 arch 的,虽然里面这种 image 没有 ELF,但不清楚会有什么不好影响,这毕竟是非标准做法
    考虑到 chainguard 支持的架构不如 google distroless 多,因此改用后者,并且现在支持更多架构
  • geodat 分 v2fly 和 loyalsoldier,事实上早就弃用 v2fly 版了,docker 版再区分它们无意义
    改成 loyalsoldier,因此 没有 -ls 标签了
  • go 编译环境是 alpine,而 golang 官方说它是不受支持的
    所以换成 golang:latest,有需要的话也可以指定版本,以前是指定的,为啥 @yuhan6665 改为 latest 了

支持的架构:

  • linux/amd64
  • linux/arm/v7
  • linux/arm64
  • linux/ppc64le
  • linux/s390x
  • linux/386
  • linux/arm/v6
  • linux/loong64
  • linux/riscv64

@Meo597 Meo597 force-pushed the refactor-docker branch from 3ff0ffe to f69801b Compare May 18, 2025 03:09
@Meo597 Meo597 force-pushed the refactor-docker branch from f69801b to d9a6d70 Compare May 18, 2025 14:34
@RPRX RPRX merged commit d44c78b into XTLS:main Jun 6, 2025
39 checks passed
@RPRX
Copy link
Member

RPRX commented Jun 6, 2025

反正这 docker 也不知道有多少人用,随便改,先合了

@SuperNG6
Copy link

为什么要加上这一部分

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

@Meo597
Copy link
Contributor Author

Meo597 commented Jun 17, 2025

日志预配是为了保障用户隐私,因为 docker 环境比较特殊
log.access 默认为空会输出到 stdout,然后被 docker 日志驱动持久化,这是非预期行为
log.error 是为了告诉用户只有这个路径能写文件,尽量防止用户瞎折腾权限,它默认 warn 因此几乎不会记录任何内容

其它空配置文件是为了做权限,和 XTLS/xray-install 脚本行为一致

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants