我正在创建一个 Nginx docker 映像,我将在 AWS 的 ECS/Fargate 中将其用作反向代理组件。我使用官方 Nginx 镜像作为基础镜像(1.17.5)。
当容器启动时,我尝试从 ENTRYPOINT 运行 bash 脚本以访问 AWS Parameter Store 并检索证书信息。这工作正常,但是当我尝试添加一个参数以传递给 bash 脚本时(例如 ENTRYPOINT ["installcerts.sh", "AppName"] 它执行脚本但容器终止而没有错误。
我希望容器在参数化批处理脚本之后继续启动 Nginx。
这是我的 Docker 文件:
FROM nginx:1.17.5
# Install AWS CLI/BOTO3, JQ
RUN apt-get update && apt-get install -y && apt-get install awscli -y && apt-get install jq -y
# Copy Nginx config to etc/nginx
COPY proxy_ssl.conf /etc/nginx/conf.d/
VOLUME ["/etc/nginx/conf/d"]
# Copy entrypoint bash script to install certs from the AWS Parameter Store
COPY installcerts.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/installcerts.sh
#Pull certs from Parameter Store
ENTRYPOINT ["/usr/local/bin/installcerts.sh", "AppName"]
CMD ["nginx", "-g", "daemon off;"]
这是我的“installcerts.sh”脚本,显示了使用从 ENTRYPOINT 传入的参数。
#!/usr/bin/env bash
-e
echo Installing certs...
aws ssm get-parameters --name /Certificate/$1/CRT | jq '.Parameters[0].Value' -r > /etc/nginx/conf.d/app.crt
aws ssm get-parameters --name /Certificate/$1/KEY | jq '.Parameters[0].Value' -r > /etc/nginx/conf.d/app.key
echo Exiting script.
exec "$@"
bash 脚本中的 "exec "$@" 是必需的,但老实说,即使经过数小时的尝试追踪它,我也不完全理解它是如何或为什么起作用的。
短篇小说是:
如果我使用它,容器会执行我希望它执行的操作,但我无法将参数发送到 bash 脚本。
ENTRYPOINT ["/usr/local/bin/installcerts.sh"]
但是如果我使用它,脚本将成功运行 WITH 参数,但容器退出并且 Nginx 没有启动。
ENTRYPOINT ["/usr/local/bin/installcerts.sh", "AppName"]
我究竟做错了什么?