chi*_*tus 6 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"]
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
Docker给我一个例外,说-e exec命令未找到。
但是,如果我将dockerfile更改为使用ENTRYPOINT而不是CMD,则-e标志有效,但Web服务器无法启动。
我在这里想念什么吗?ENTRYPOINT是否被覆盖?
编辑:
所以我已经更新了我的dockerfile以使用 ENTRYPOINT ["bash","/usr/share/nginx/html/runfile.sh", ";", " nginx -g daemon off;"]
但是docker容器仍然关闭。有什么我想念的吗?
NGINX 1.19/docker-entrypoint.d在根目录中有一个文件夹,用于放置脚本执行的启动脚本docker-entrypoint.sh。您还可以读取日志上的执行情况。
/docker-entrypoint.sh: /docker-entrypoint.d/ 不为空,会尝试执行配置
/docker-entrypoint.sh:在 /docker-entrypoint.d/ 中寻找 shell 脚本
/docker-entrypoint.sh:启动
[…………]
/docker-entrypoint.sh:配置完成;准备启动
对于我未来的自己和其他人,这是在启动时设置变量替换的方法(对于 nginx,也可能适用于其他图像):
我还写了一篇关于它的更深入的博客文章:https : //danielhabenicht.github.io/docker/angular/2019/02/06/angular-nginx-runtime-variables.html
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;"]
Run Code Online (Sandbox Code Playgroud)
subsitute.sh:(与@Daniel West 的回答相同)
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;"]
Run Code Online (Sandbox Code Playgroud)
现在你可以运行 docker run -e TEST="set at command line" -it <image_name>
问题是WORKDIR,没有它 nginx 命令将不会被执行。如果您想将此应用于其他容器,请务必相应地设置WORKDIR。
如果你想在多个文件中递归地进行替换,这就是你正在寻找的 bash 脚本:
#!/bin/bash
if [[ -z $1 ]]; then
echo 'ERROR: No target file given.'
exit 1
fi
#Substitute all environment variables defined in the file given as argument
envsubst '\$TEST \$UPSTREAM_CONTAINER \$UPSTREAM_PORT' < $1 > $1
# Execute all other paramters
exec "${@:2}"
Run Code Online (Sandbox Code Playgroud)
小智 1
nginx 容器已经定义了 ENTRYPOINT。如果您还定义了 CMD,它将像“ENTRYPOINT CMD”一样将它们组合起来,这样 CMD 就会成为 ENTRYPOINT 的参数。这就是为什么您需要重新定义 ENTRYPOINT 才能使其正常工作。
通常ENTRYPOINT是这样定义的,如果你也传递CMD,它将由ENTRYPOINT脚本执行。然而,并非每个容器都是如此。
| 归档时间: |
|
| 查看次数: |
3880 次 |
| 最近记录: |