脚本位于这里: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 "$@"在上面,调用没有args的set是做什么的?
我希望这不算太多。我觉得为每一个问题提一个单独的问题都太过分了,特别是因为这一切都是相互关联的。
发布于 2016-06-08 02:09:16
用于"$baseDir"/*/ "$baseDir"/themes/*/;do 在上面,为什么他们同时指定
/*/和/themes/*/?/*/不应该包含主题吗?*不是因为某种原因而成为通配符吗?
主题/在第一次匹配中,但主题/*/不是,因此需要第二个条目来包含主题的内容。
targetDir="$GHOST_CONTENT/${dir#$baseDir/}“ 在上面,#在变量展开中的意义是什么?
它从$baseDir中删除$dir前缀。例如:
bash$ dir=/home/bmitch/data/docker
bash$ echo $dir
/home/bmitch/data/docker
bash$ echo ${dir#/home/bmitch}
/data/dockertar -c --一个文件系统-C "$dir“。tar xC "$targetDir“ 在上述情况下,这是否能节省时间?为什么不使用类似rsync之类的东西呢?我明白-C的意义,但为什么-c和-一个文件系统?
默认情况下,rsync可能不会安装在每台计算机上,tar是相当通用的。-c是要创建、vs提取和-一个文件系统避免tar继续到外部挂载点(nfs,符号链接到根,等等)。
sed -r‘s/127.1/0.0.0.0/g;s!path.join(__dirname,__dirname \1!g;’$GHOST_SOURCE/config.example.js“>$-r_CONTENT/config.js) 这个sed命令是做什么的?我知道这是一种替代,但是为什么"$GHOST_SOURCE/config.example.js“> "$GHOST_CONTENT/config.js”作为结尾呢?
config.example.js是输入(对sed的最后一个arg ),config.js是输出(在>>之后)。因此它使用config.example.js,将ip地址从127.0.0.1更改为0.0.0.0,有效地侦听所有接口/ip,而不是仅仅在环回上内部监听。sed的下半部分将path.join参数从__dirname更改为process.env.GHOST_CONTENT。
在“$ -sf _CONTENT/config.js”中,“$-sf_SOURCE/config.js” 在上面,这种符号联系的意义是什么?如果两个文件都已经存在,为什么要尝试将它们链接到对方呢?
$GHOST_SOURCE/config.js被替换(-f)为$GHOST_CONTENT/config.js的链接。符号链接提供对另一个实际文件的文件名引用,因此将有两个名称,但是有一个数据副本,这意味着在这种情况下只有一个配置。
设置-$@用户 在上面,没有args的调用集是做什么的?
这将$1、$2、. $n的值更改为$1=gosu、$2=user、$3=the旧$1、$4=the旧$2.,这实际上是将gosu和user添加到脚本传递参数的开头。--确保集合不会将$@的任何值解释为自己的标志.
https://stackoverflow.com/questions/37691607
复制相似问题