在NGINX Docker容器中启动之前运行bash脚本

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容器仍然关闭。有什么我想念的吗?

Max*_*Max 9

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:配置完成;准备启动


Dan*_*cht 5

对于我未来的自己和其他人,这是在启动时设置变量替换的方法(对于 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脚本执行。然而,并非每个容器都是如此。