如何通过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镜像为例)
- 创建自定义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
- 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容器
- 创建启动脚本(命名为
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
- 修改ngrok.yml的占位符:
authtoken: AUTH_TOKEN_PLACEHOLDER tunnels: ftp: proto: tcp addr: ftp:21
- 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
相关产品推荐
相关产品推荐

