如何将带空格的参数传递给 docker 运行
How can one pass an argument to docker run with spaces
这可能特定于 https://github.com/atmoz/sftp/blob/master/entrypoint#L36
完成的参数解析
但我正在尝试创建一个带空格的目录:
我试过的一些例子:
docker run -d atmoz/sftp:alpine-3.7 user:password:::Inbound - Test Dir
...
[entrypoint] Parsing user data: "user:password:::Inbound"
Creating mailbox file: No such file or directory
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Parsing user data: "-"
[entrypoint] ERROR: Invalid username "-", do not match required regex pattern: [A-Za-z0-9._][A-Za-z0-9._-]{0,31}
docker run -d atmoz/sftp:alpine-3.7 user:password:::"Inbound - Test Dir"
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
docker run -d atmoz/sftp:alpine-3.7 "user:password:::Inbound - Test Dir"
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
docker run -d atmoz/sftp:alpine-3.7 user:password:::Inbound\ -\ Test\ Dir
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
docker run -d atmoz/sftp:alpine-3.7 user:password:::'Inbound - Test Dir'
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
在我看来这是 createUser
函数中的错误,因为包含目录名称的各种变量周围缺少双引号。没有办法通过在参数中添加转义符、引号等来解决这个问题;您真的必须修复导致问题的脚本。
我还没有测试过,但是像这样在第 98-111 行适当地添加双引号可能会成功:
# Make sure dirs exists
if [ -n "$dir" ]; then
IFS=',' read -a dirArgs <<< "$dir" # Quotes added here
for dirPath in "${dirArgs[@]}"; do # And here
dirPath="/home/$user/$dirPath"
if [ ! -d "$dirPath" ]; then
log "Creating directory: $dirPath"
mkdir -p "$dirPath" # And here
chown -R $uid:users "$dirPath" # And here
else
log "Directory already exists: $dirPath"
fi
done
fi
脚本中可能还有其他地方导致了该问题,但至少需要进行上述更改。此外,我添加引号的第一行仅在 bash 的某些版本上需要它们,但最好将它们放在那里以防万一。
p.s。第 39 行可能也应该被修复:
IFS=':' read -a args <<< ""
当前版本使用$@
,这很奇怪。该函数只传递一个参数,bash 的某些版本如果不加引号就会错误解析,所以我的版本是更好的方法。
shellcheck.net 指出了一堆其他可疑的事情,但这是我认为唯一重要的事情。
这已在基于此线程的最新版本中修复:https://github.com/atmoz/sftp/issues/143
这可能特定于 https://github.com/atmoz/sftp/blob/master/entrypoint#L36
完成的参数解析但我正在尝试创建一个带空格的目录:
我试过的一些例子:
docker run -d atmoz/sftp:alpine-3.7 user:password:::Inbound - Test Dir
...
[entrypoint] Parsing user data: "user:password:::Inbound"
Creating mailbox file: No such file or directory
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Parsing user data: "-"
[entrypoint] ERROR: Invalid username "-", do not match required regex pattern: [A-Za-z0-9._][A-Za-z0-9._-]{0,31}
docker run -d atmoz/sftp:alpine-3.7 user:password:::"Inbound - Test Dir"
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
docker run -d atmoz/sftp:alpine-3.7 "user:password:::Inbound - Test Dir"
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
docker run -d atmoz/sftp:alpine-3.7 user:password:::Inbound\ -\ Test\ Dir
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
docker run -d atmoz/sftp:alpine-3.7 user:password:::'Inbound - Test Dir'
...
[entrypoint] Creating directory: /home/user/Inbound
[entrypoint] Creating directory: /home/user/-
[entrypoint] Creating directory: /home/user/Test
[entrypoint] Creating directory: /home/user/Dir
在我看来这是 createUser
函数中的错误,因为包含目录名称的各种变量周围缺少双引号。没有办法通过在参数中添加转义符、引号等来解决这个问题;您真的必须修复导致问题的脚本。
我还没有测试过,但是像这样在第 98-111 行适当地添加双引号可能会成功:
# Make sure dirs exists
if [ -n "$dir" ]; then
IFS=',' read -a dirArgs <<< "$dir" # Quotes added here
for dirPath in "${dirArgs[@]}"; do # And here
dirPath="/home/$user/$dirPath"
if [ ! -d "$dirPath" ]; then
log "Creating directory: $dirPath"
mkdir -p "$dirPath" # And here
chown -R $uid:users "$dirPath" # And here
else
log "Directory already exists: $dirPath"
fi
done
fi
脚本中可能还有其他地方导致了该问题,但至少需要进行上述更改。此外,我添加引号的第一行仅在 bash 的某些版本上需要它们,但最好将它们放在那里以防万一。
p.s。第 39 行可能也应该被修复:
IFS=':' read -a args <<< ""
当前版本使用$@
,这很奇怪。该函数只传递一个参数,bash 的某些版本如果不加引号就会错误解析,所以我的版本是更好的方法。
shellcheck.net 指出了一堆其他可疑的事情,但这是我认为唯一重要的事情。
这已在基于此线程的最新版本中修复:https://github.com/atmoz/sftp/issues/143