Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在NGINX docker容器中启动前运行bash脚本_Javascript_Bash_Nginx_Docker_Dockerfile - Fatal编程技术网

Javascript 在NGINX docker容器中启动前运行bash脚本

Javascript 在NGINX docker容器中启动前运行bash脚本,javascript,bash,nginx,docker,dockerfile,Javascript,Bash,Nginx,Docker,Dockerfile,我正在尝试使用docker在localhost:8000上运行javascript应用程序。我想做的部分工作是根据docker run命令交换一些配置文件,我想将一个环境变量传递到容器中,以便bash脚本可以将其用作参数 我的dockerfile是这样的: FROM nginx COPY . /usr/share/nginx/html CMD ["bash","/usr/share/nginx/html/runfile.sh"] bash脚本如下所示: #!/bin/bash if [ "$S

我正在尝试使用docker在localhost:8000上运行javascript应用程序。我想做的部分工作是根据docker run命令交换一些配置文件,我想将一个环境变量传递到容器中,以便bash脚本可以将其用作参数

我的dockerfile是这样的:

FROM nginx
COPY . /usr/share/nginx/html
CMD ["bash","/usr/share/nginx/html/runfile.sh"]
bash脚本如下所示:

#!/bin/bash
if [ "$SECURITY_VERSION" = "OPENAM" ]; then
    sed -i -e 's/localhost/openam/g' authConfig.js
fi

docker run -p 8000:80 missioncontrol:latest -e SECURITY_VERSION="TEST"
Docker给了我一个异常,说没有找到-e exec命令

但是,如果我将dockerfile更改为使用ENTRYPOINT而不是CMD,则-e标志会起作用,但Web服务器不会启动

这里有我遗漏的东西吗?入口点被覆盖了吗

编辑:


因此,我更新了dockerfile以使用
ENTRYPOINT[“bash”、“/usr/share/nginx/html/runfile.sh”、“;”、“nginx-g守护进程关闭”]


但是docker容器仍然关闭。我缺少什么吗?

nginx容器已经定义了入口点。若您还定义了CMD,它会像“ENTRYPOINT CMD”一样将两者结合起来,这样CMD就成为ENTRYPOINT的参数。这就是为什么需要重新定义入口点以使其工作


通常ENTRYPOINT是这样定义的,如果您也传递CMD,它将由ENTRYPOINT脚本执行。但是,并非每个容器都是如此。

我知道这已经很晚了,但我在搜索解决方案时发现了此线程,因此我想与大家分享

我也有同样的问题。您的入口点脚本还应包括
exec“$@”

#/垃圾箱/垃圾箱
set-e
envsubt“\$CORS\u HOST\$UPSTREAM\u CONTAINER\$UPSTREAM\u PORT”/etc/nginx/conf.d/default.conf
执行官“$@”

这意味着将运行
nginx:alpine
容器中的startup CMD。上面的脚本将把指定的环境变量注入配置文件。通过在运行时执行此操作,yo可以覆盖环境变量。

对于我未来的自己和其他人,这就是如何在启动时设置变量替换的方法(对于nginx,可能也适用于其他映像):

我还写了一篇更深入的博客文章:

Dockerfile:

FROM nginx

ENV TEST="Hello variable"

WORKDIR /etc/nginx
COPY ./substituteEnv.sh ./substituteEnv.sh

# Execute the subsitution script and pass the path of the file to replace
ENTRYPOINT ["./substituteEnv.sh", "/usr/share/nginx/html/index.html"]
CMD ["nginx", "-g", "daemon off;"]
substitute.sh:(与@Daniel West的答案相同)

#/bin/bash
如果[[-z$1]];然后
echo“错误:没有给定目标文件。”
出口1
fi
#替换文件中定义为参数的所有环境变量
envsubt'\$TEST\$UPSTREAM\u CONTAINER\$UPSTREAM\u PORT'<$1>$1
#执行所有其他参数
执行“${@:2}”
现在您可以运行
docker run-e TEST=“在命令行设置”-it

捕获的是
WORKDIR
,如果没有它,nginx命令将无法执行。如果要将其应用于其他容器,请确保相应地设置
WORKDIR

如果您想在多个文件中递归地进行替换,这是您要查找的bash脚本:

#替换所有给定的环境变量
变量=(测试)
如果[[-z$1]];然后
echo“错误:没有给定目标文件或目录。”
出口1
fi
对于“${variables[@]}”中的i
做
如果[[-z${!i}]];然后
echo“错误:未定义变量“%$i”
出口1
fi
echo$i${!i}$1
#要替换的变量的格式应为:${TEST}
grep-rl$i$1 | xargs sed-i“s/\${$i}/${!i}/Ig”
完成
执行“${@:2}”

更新dockerfile中的CMD行,如下所示。请注意,如果
runfile.sh
没有成功(
exit 0;
在其中),那么下一个
nginx
命令将不会执行

FROM nginx
COPY . /usr/share/nginx/html
CMD /usr/share/nginx/html/runfile.sh && nginx -g 'daemon off;'
在您使用的基本映像上启动服务器。在dockerfile中使用CMD命令时,会覆盖其映像中的命令。正如本报告所述:

Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令生效


NGINX 1.19在根目录上有一个文件夹
/docker entrypoint.d
,其中放置了由
docker entrypoint.sh
脚本执行的启动脚本。您还可以读取日志上的执行情况

/docker-entrypoint.sh:/docker-entrypoint.d/不为空,将 尝试执行配置

/docker-entrypoint.sh:在中查找shell脚本 /docker入口点/

/docker-entrypoint.sh:启动

[……]

/docker-entrypoint.sh:配置完成;准备好启动了吗


你可能根本不想要
-e
。您可能还需要
RUN
而不是
CMD
,因此
RUN/usr/share/nginx/html/runfile.sh
?但是我想从docker RUN命令传递一个值,有没有比-e更好的方法?我曾考虑过
docker run-p 8000:80 missioncontrol:latest/bin/bash-c”/usr/share/nginx/html/runfile.sh OPENAM“
,但当时web服务器没有启动,我说的是sed命令:POh是的,是的,也许我不需要-e谢谢这是我的怀疑,我可能需要查看nginx文档,看看是否能找到他们使用的入口点,所以我更新了我的dockerfile以使用
ENTRYPOINT[“bash”、“/usr/share/nginx/html/runfile.sh”、“;”、“nginx-g daemon off;”]
但docker容器仍会关闭。有什么我遗漏的吗?我正在使用nginx:1.15.1-alpine。我需要在docker运行时运行sh脚本。。。使用compose文件中定义的一些env变量,但我找不到正确的语法。我试图覆盖入口点,但没有成功。如果我在容器启动后使用默认CMD运行相同的脚本,它会工作。附言:我不得不搬走/bin/sh形成脚本文件,以便能够在运行的containerIt上执行它,这对我很有帮助,因为我意识到您可以在GitHub上找到的docker-entrypoint.sh仅在NGINX 1.19之后才存在。我以前用过旧版本的。谢谢!这正是我要找的。谢谢你,伙计。在我失去两个孩子后,你救了我一天。正在与自定义入口点进行斗争,w
FROM nginx
COPY . /usr/share/nginx/html
CMD /usr/share/nginx/html/runfile.sh && nginx -g 'daemon off;'