【问题标题】:`': No such file or directoryute 'sh` when starting docker container`': 启动 docker 容器时没有这样的文件或目录 'sh`
【发布时间】:2022-02-17 14:22:05
【问题描述】:

我有一个代理容器,它有一个入口点脚本,用于在启动时创建一个自签名证书,如果没有找到 - 如果没有,pod 在 kubernetes 中启动时崩溃,所以我无法复制真正的证书

所以我的问题有两个;

1- 必须有更好的方法来做到这一点

2- 如果不是,': No such file or directoryute 'sh 到底是什么意思 - 这是容器日志中唯一的内容。

这里是 Dockerfile:

FROM nginx:1-alpine

RUN chown -R nginx:nginx /var/cache/nginx
RUN chown -R nginx:nginx /var/log/nginx
RUN chown -R nginx:nginx /etc/nginx/conf.d
RUN touch /var/run/nginx.pid
RUN chown -R nginx:nginx /var/run/nginx.pid

COPY ./entrypoint.sh /custom-entrypoint.sh
RUN chmod +x /custom-entrypoint.sh

USER nginx

COPY service.conf /etc/nginx/conf.d/service.conf
COPY nginx.conf /etc/nginx/nginx.conf
COPY .keep *.include /etc/nginx/includes/

COPY 50x.html /usr/share/nginx/html/50x.html

COPY ./ssl/* /etc/nginx/cert/

ENTRYPOINT ["/custom-entrypoint.sh"]
CMD ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

还有入口点脚本:

#!/usr/bin/env sh

set -e

if [ -f "/etc/nginx/cert/listener.key" ]; then
    # Create a certificate if none exists - to prevent a crash
    openssl req -x509 -nodes -days 365 \
    -subj "/C=CA/ST=QC/O=Company, Inc./CN=example.com" \
    -addext "subjectAltName=DNS:example.com" \
    -newkey rsa:2048 \
    -keyout /etc/nginx/cert/listener.key \
    -out /etc/nginx/cert/listener.crt;
fi

exec "$@"

【问题讨论】:

  • 也许不相关,但容器现在将自己标记为 proxy_1ner 而不是通常的 proxy_1 ...
  • 你能把(签名的)证书和私钥放在 Kubernetes Secret 中,然后挂载到你的部署规范中吗?然后证书文件将始终存在。如果您在 Windows 系统上进行开发,您还可以仔细检查您的入口点脚本是否具有 Unix 行结尾,因为我认为这可能会导致错误。

标签: docker nginx kubernetes


【解决方案1】:

刚刚遇到这个问题。发现我的入口点 run.sh 有 CRLF (Windows) 而不仅仅是 LF (Linux) 行结束。重新另存为LF,重建镜像,就可以正常运行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2015-06-14
    • 2021-05-17
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多