以下脚本是我的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 ...]
我在这里缺少什么?怎么了?
答案 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à,效果很好。