You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Secrets向FTP与ngrok容器传递敏感信息?

问题解决与方案建议

先解决当前容器的报错问题

1. ngrok容器的unknown shorthand flag: 'c' in -c错误

ngrok官方容器不支持-c参数指定配置文件,正确参数为--config。如果用自定义脚本替换配置后启动,确保启动命令为:

exec ngrok start --all --config /etc/ngrok/ngrok.yml

2. FTP容器的用户组与密码错误

  • 用户组不存在:若使用Alpine系FTP镜像(如vsftpd),默认无alpineftp组,可自行创建(addgroup -S alpineftp),或改用镜像自带的ftp组。
  • 密码与用户名相似:直接修改FTP密码的secret文件,确保密码与用户名不同;若必须用相似密码,可尝试chpasswd -f强制跳过检查(不推荐,存在安全风险)。

3. AUTH_TOKEN变量未设置报错

ngrok配置文件不支持直接读取环境变量,需通过脚本读取secret内容后替换配置文件中的占位符,而非依赖环境变量传递。


疑问1:如何正确通过Docker Secrets传递值

Docker Secrets会将敏感内容挂载到容器内/run/secrets/<secret-name>路径下,针对两个容器分别处理:

针对FTP容器(以vsftpd Alpine镜像为例)

  1. 创建自定义entrypoint脚本(命名为ftp-entrypoint.sh):
#!/bin/sh
set -e

# 从secrets读取用户名和密码
FTP_USER=$(cat /run/secrets/ftp_user)
FTP_PASS=$(cat /run/secrets/ftp_pass)

# 创建用户组(如果不存在)
if ! getent group alpineftp > /dev/null; then
    addgroup -S alpineftp
fi

# 创建FTP用户并加入组
adduser -D -G alpineftp $FTP_USER

# 设置用户密码
echo "$FTP_USER:$FTP_PASS" | chpasswd

# 启动vsftpd服务
exec vsftpd /etc/vsftpd/vsftpd.conf

给脚本加执行权限:chmod +x ftp-entrypoint.sh

  1. compose.yaml配置:
version: '3.8'

secrets:
  ftp_user:
    file: ./ftp_user.txt  # 文件内仅存用户名
  ftp_pass:
    file: ./ftp_pass.txt  # 文件内仅存密码
  ngrok_auth_token:
    file: ./ngrok_auth_token.txt  # 文件内存ngrok的auth token

services:
  ftp:
    image: fauria/vsftpd  # 替换为你使用的FTP镜像
    secrets:
      - ftp_user
      - ftp_pass
    volumes:
      - ./ftp-entrypoint.sh:/entrypoint.sh
      - ./ftp-data:/home/vsftpd  # 挂载FTP数据目录
    entrypoint: /entrypoint.sh
    ports:
      - "21:21"
      - "20:20"
      - "21100-21110:21100-21110"
    environment:
      - PASV_ADDRESS=your-ngrok-domain.ngrok.io
      - PASV_MIN_PORT=21100
      - PASV_MAX_PORT=21110

针对ngrok容器

  1. 创建启动脚本(命名为ngrok-start.sh):
#!/bin/sh
set -e

# 替换ngrok.yml中的AUTH_TOKEN占位符
sed -i "s/AUTH_TOKEN_PLACEHOLDER/$(cat /run/secrets/ngrok_auth_token)/g" /etc/ngrok/ngrok.yml

# 启动ngrok
exec ngrok start --all --config /etc/ngrok/ngrok.yml

给脚本加执行权限:chmod +x ngrok-start.sh

  1. 修改ngrok.yml的占位符:
authtoken: AUTH_TOKEN_PLACEHOLDER
tunnels:
  ftp:
    proto: tcp
    addr: ftp:21
  1. compose.yaml添加ngrok服务:
ngrok:
    image: ngrok/ngrok:latest
    secrets:
      - ngrok_auth_token
    volumes:
      - ./ngrok-start.sh:/start.sh
      - ./ngrok.yml:/etc/ngrok/ngrok.yml
    entrypoint: /start.sh

疑问2:更优的敏感信息传递方案

1. 优先使用镜像原生支持的_FILE环境变量

很多官方容器(如postgres、部分FTP镜像)支持通过XXX_FILE环境变量读取secrets文件内容,无需自定义脚本。例如FTP容器若支持该特性,可直接配置:

services:
  ftp:
    environment:
      - FTP_USER_FILE=/run/secrets/ftp_user
      - FTP_PASS_FILE=/run/secrets/ftp_pass
    secrets:
      - ftp_user
      - ftp_pass

这种方式无需编写bash脚本,简洁可靠。

2. 分离敏感与非敏感配置

用Docker Secrets存敏感信息,用Docker Configs或本地挂载存ngrok.yml这类非敏感配置,逻辑更清晰(个人小项目直接挂载本地文件也可)。

3. 避免复杂entrypoint逻辑

若bash知识有限,优先选择支持环境变量或_FILE变量的官方镜像,减少自定义脚本编写,降低出错概率。


内容的提问来源于stack exchange,提问作者edi Anderegg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:34:51