首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解码头入口点脚本

理解码头入口点脚本
EN

Stack Overflow用户
提问于 2016-06-08 00:41:00
回答 1查看 394关注 0票数 1

脚本位于这里:https://github.com/docker-library/ghost/blob/master/docker-entrypoint.sh

代码语言:javascript
复制
#!/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有很多我从未见过的东西。所以我有很多问题。

代码语言:javascript
复制
for dir in "$baseDir"/*/ "$baseDir"/themes/*/; do

在上面,为什么他们同时指定/*//themes/*//*/不应该包含主题吗?*不是因为某种原因而成为通配符吗?

代码语言:javascript
复制
targetDir="$GHOST_CONTENT/${dir#$baseDir/}"

在上面,#在变量展开中的意义是什么?

代码语言:javascript
复制
tar -c --one-file-system -C "$dir" . | tar xC "$targetDir"

在上述情况下,这是否能节省时间?为什么不使用类似rsync之类的东西呢?我明白-C的意义,但为什么-c--one-file-system

代码语言:javascript
复制
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"作为结束?

代码语言:javascript
复制
ln -sf "$GHOST_CONTENT/config.js" "$GHOST_SOURCE/config.js"

在上面,这种符号联系的意义是什么?如果两个文件都已经存在,为什么要尝试将它们链接到对方呢?

代码语言:javascript
复制
set -- gosu user "$@"

在上面,调用没有args的set是做什么的?

我希望这不算太多。我觉得为每一个问题提一个单独的问题都太过分了,特别是因为这一切都是相互关联的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 02:09:16

用于"$baseDir"/*/ "$baseDir"/themes/*/;do 在上面,为什么他们同时指定/*//themes/*//*/不应该包含主题吗?*不是因为某种原因而成为通配符吗?

主题/在第一次匹配中,但主题/*/不是,因此需要第二个条目来包含主题的内容。

targetDir="$GHOST_CONTENT/${dir#$baseDir/}“ 在上面,#在变量展开中的意义是什么?

它从$baseDir中删除$dir前缀。例如:

代码语言:javascript
复制
bash$ dir=/home/bmitch/data/docker
bash$ echo $dir
/home/bmitch/data/docker
bash$ echo ${dir#/home/bmitch}
/data/docker

tar -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添加到脚本传递参数的开头。--确保集合不会将$@的任何值解释为自己的标志.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37691607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档