【发布时间】:2016-10-08 01:53:24
【问题描述】:
脚本位于:https://github.com/docker-library/ghost/blob/master/docker-entrypoint.sh
#!/bin/bash
set -e
if [[ "$*" == npm*start* ]]; then
baseDir="$GHOST_SOURCE/content"
for dir in "$baseDir"/*/ "$baseDir"/themes/*/; do
targetDir="$GHOST_CONTENT/${dir#$baseDir/}"
mkdir -p "$targetDir"
if [ -z "$(ls -A "$targetDir")" ]; then
tar -c --one-file-system -C "$dir" . | tar xC "$targetDir"
fi
done
if [ ! -e "$GHOST_CONTENT/config.js" ]; then
sed -r '
s/127\.0\.0\.1/0.0.0.0/g;
s!path.join\(__dirname, (.)/content!path.join(process.env.GHOST_CONTENT, \1!g;
' "$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js"
fi
ln -sf "$GHOST_CONTENT/config.js" "$GHOST_SOURCE/config.js"
chown -R user "$GHOST_CONTENT"
set -- gosu user "$@"
fi
exec "$@"
据我所知,如果您使用npm start 的某些变体将某些文件从$GHOST_SOURCE 移动到$GHOST_CONTENT,请对config.js 文件执行某些操作,链接配置文件,设置所有权内容文件,然后以用户user 执行npm start。否则,它只会正常运行您的命令。
这些细节对我来说很难理解,因为 bash 中有很多我以前从未见过的东西。所以我有很多问题。
for dir in "$baseDir"/*/ "$baseDir"/themes/*/; do
在上面,为什么他们同时指定/*/ 和/themes/*/? /*/ 不应该包含主题吗? * 出于某种原因不是通配符吗?
targetDir="$GHOST_CONTENT/${dir#$baseDir/}"
以上,变量展开中#的意义何在?
tar -c --one-file-system -C "$dir" . | tar xC "$targetDir"
在上面,这是否节省了时间?为什么不使用 rsync 之类的东西?我明白-C 的意思,但是为什么-c 和--one-file-system?
sed -r '
s/127\.0\.0\.1/0.0.0.0/g;
s!path.join\(__dirname, (.)/content!path.join(process.env.GHOST_CONTENT, \1!g;
' "$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js"
这个sed 命令有什么作用?我知道它是一个替代品,但为什么"$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js"作为结尾?
ln -sf "$GHOST_CONTENT/config.js" "$GHOST_SOURCE/config.js"
在上面,这个符号链接的意义是什么?如果两个文件都已经存在,为什么还要尝试将它们相互链接?
set -- gosu user "$@"
在上面调用set 没有参数做什么?
我希望这不是太多。我觉得为每一个问题单独提出一个问题太过分了,尤其是因为它们都是相互关联的。
【问题讨论】: