启动脚本失败,错误“-e:invalid option”,缺少什么?

时间:2017-02-07 16:43:11

标签: linux bash docker

以下脚本是我的Dockerfile的ENTRYPOINT

/config/bootstrap.sh

#!/bin/bash

set -e
set -u

# Supervisord default params
SUPERVISOR_PARAMS='-c /etc/supervisord.conf'

mkdir -p /data/conf /data/run /data/logs
chmod 711 /data/conf /data/run /data/logs

if [ "$(ls /config/init/)" ]; then
  for init in /config/init/*.sh; do
    . $init
  done
fi

# We have TTY, so probably an interactive container...
if test -t 0; then
  # Run supervisord detached...
  supervisord $SUPERVISOR_PARAMS

  # Some command(s) has been passed to container? Execute them and exit.
  # No commands provided? Run bash.
  if [[ $@ ]]; then
    eval $@
  else
    export PS1='[\u@\h : \w]\$ '
    /bin/bash
  fi    
else
  # If some extra params were passed, execute them before.
  if [[ $@ ]]; then
    eval $@
  fi
  supervisord -n $SUPERVISOR_PARAMS
fi

正如您所看到的,我正在从/config/init获取所有脚本并运行它们,对吧?其中一个脚本就是这个:

#!/bin/sh

set -e

DATA_DIR="/data/www"
WEB_DIR="$DATA_DIR/web"
VAR_DIR="$DATA_DIR/var"

usermod -u 1000 apache && groupmod -g 1000 apache && \
chown -R apache:root $DATA_DIR

if  [ "$(ls -la $WEB_DIR)" ]; then
    find "$WEB_DIR" -type d -print0 -exec chmod 777 {} \;
fi

if  [ "$(ls -la $VAR_DIR)" ]; then
    find "$VAR_DIR" -type d -print0 -exec chmod 777 {} \;
fi

if [ "$(ls -a $DATA_DIR)" ]; then
    touch "$DATA_DIR"/index.php
    echo "<?php phpinfo(); ?>" > "$DATA_DIR"/index.php
fi

exec "$@"

每次尝试在成功构建时运行容器,都会出现以下错误:

$ docker run -it reynierpm/php-fpm -e INSTALL_COMPOSER=true
ls: cannot access /data/www/web: No such file or directory
ls: cannot access /data/www/var: No such file or directory
/config/init/20-permissions.sh: line 26: exec: -e: invalid option
exec: usage: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]

更新

上述脚本已更新为以下内容:

#!/bin/bash

set -e

data_dir="/data/www"
web_dir="$data_dir/web"
var_cache_dir="$data_dir/var/cache"
var_logs_dir="$data_dir/var/logs"

# This script will be placed in /config/init/ and run when container starts.
usermod -u 1000 apache && groupmod -g 1000 apache && \
chown -R apache:root "$data_dir"

# Setup web directory permissions and ownership
if  [ -d "$web_dir" ]; then
    chgrp -R apache "$web_dir"
    chmod -R g+w "$web_dir"
    find "$web_dir" -type d -exec chmod 2775 {} +
    find "$web_dir" -type f -exec chmod ug+rw {} +
fi

# Setup cache directory permissions and ownership
if  [ -d "$var_cache_dir" ]; then
    chgrp -R apache "$var_cache_dir"
    chmod -R g+w "$var_cache_dir"
    find "$var_cache_dir" -type d -exec chmod 2775 {} +
    find "$var_cache_dir" -type f -exec chmod ug+rw {} +
fi

# Setup cache directory permissions and ownership
if  [ -d "$var_logs_dir" ]; then
    chgrp -R apache "$var_logs_dir"
    chmod -R g+w "$var_logs_dir"
    find "$var_logs_dir" -type d -exec chmod 2775 {} +
    find "$var_logs_dir" -type f -exec chmod ug+rw {} +
fi

# Create index.php file if $data_dir is empty
if files=("$data_dir"/*); [[ -e "${files[0]}" ]]; then
    echo '<?php phpinfo(); ?>' > "$data_dir/index.php";
fi

exec "$@"

但仍然没有工作......

$ docker run -it reynierpm/php-fpm -e INSTALL_COMPOSER="true"
/config/init/21-permissions.sh: line 43: exec: -e: invalid option
exec: usage: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]

我在这里缺少什么?怎么了?

2 个答案:

答案 0 :(得分:0)

在辅助脚本中,最后有这一行:

exec "$@"

位置参数很可能(好的,大多数情况下确定)包含-e作为参数。那可能来自哪里,你可能会问?

您的辅助脚本由主脚本中的此行提供:

. $init

源脚本在父上下文中执行,因此不会替换位置参数(除非您在输出文件的名称后指定参数)。如果父脚本中的$1包含-e,则源代码脚本会看到该内容。您的主脚本可能正在接收参数,或者您的一个辅助脚本更改参数。在同一个上下文中执行所有这些脚本有点问题,可能存在变量和位置参数泄漏。

我看到另一个问题:您的辅助脚本以exec命令结束,该命令用参数中提供的命令替换当前进程(除了在exec用于的 <Router> <Route component={Layout}> <div> <Route path='/abc' component={ABC} /> <Route path='/xyz' component={XYZ} /> </div> </Route> </Router> 的特定情况下操纵文件描述符)。因此,我希望这个辅助脚本永远不会返回到主脚本,并且由于辅助脚本的来源,您的主脚本实际上永远不会完成。

答案 1 :(得分:0)

我从exec "$@"脚本的底部删除了jenkins.sh命令(因为我认为它可能会干扰-e命令中的docker run选项),然后重新构建Jenkins映像,然后再次运行它。 Voilà,效果很好。