当前位置: 首页 > 知识库问答 >
问题:

如何使用docker ENTRYPOINT与外壳脚本文件组合参数

方坚壁
2023-03-14

我编写了shell脚本文件,并将其与docker ENTRYPOINT一起使用,但当我运行docker image时,由于ENTRYPOINT代码行的原因,它停止了,没有任何错误日志

我的Dockerfile

FROM ubuntu:16.04
MAINTAINER limtaegeun <imori333@gmail.com>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

ENV CONTAINER_NAME nodejs
ENV SERVER_NAME myserver.com
ENV PEM_PATH /etc/nginx/certs/cert.pem
ENV KEY_PATH /etc/nginx/certs/cert.key

WORKDIR /etc/nginx

ADD ./sites-available/ssl /etc/nginx/sites-available/ssl
ADD ./docker-entrypoint.sh /etc/nginx/docker-entrypoint.sh
RUN chmod 777 /etc/nginx/docker-entrypoint.sh
EXPOSE 80 443
ENTRYPOINT /etc/nginx/docker-entrypoint.sh ${CONTAINER_NAME} ${SERVER_NAME} ${PEM_PATH} ${KEY_PATH}
CMD ["nginx"]

docker入口点。嘘

#!/bin/sh

CONTAINER_NAME=$1
SERVER_NAME=$2
PEM_PATH=$3
KEY_PATH=$4

rm -f /etc/nginx/sites-enabled/default
sed -ri 's@CONTAINER_NAME@'${CONTAINER_NAME}'@' /etc/nginx/sites-available/ssl
sed -ri 's@SERVER_NAME@'${SERVER_NAME}'@' /etc/nginx/sites-available/ssl
sed -ri 's@PEM_PATH@'${PEM_PATH}'@' /etc/nginx/sites-available/ssl
sed -ri 's@KEY_PATH@'${KEY_PATH}'@' /etc/nginx/sites-available/ssl
# cp -f sites-available/ssl sites-available/default
ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/default

我的docker run命令

docker run -v /home/ubuntu/Docker-nginx-cloudflare-ssl-proxy/certs:/etc/nginx/certs \
--name nginx-ssl -p 443:443 -p 80:80 --network nginx-net --rm -d nginx-cloudfare-ssl-proxy

有什么问题??

共有1个答案

狄冥夜
2023-03-14

当Docker容器运行时,它运行ENTRYPOINT(仅限),将CMD作为命令行参数传递,当ENTRYPOINT完成容器退出时。在Dockerfile中,ENTRYPOINT必须是JSON数组语法,才能看到CMD参数,脚本本身需要实际运行CMD,通常使用类似exec "$@"的行。

要解决这个问题,最简单的方法就是不要在环境变量和位置参数之间来回切换。ENTRYPOINT脚本将能够直接读取您在Dockerfile中设置的ENV变量(或使用docker run-e选项覆盖)。因此,如果从位置参数中删除设置这些变量的脚本的第一行,并确保运行CMD

#!/bin/sh
# delete the lines that set CONTAINER_NAME et al.
rm -f /etc/nginx/sites-enabled/default
sed -ri 's@CONTAINER_NAME@'${CONTAINER_NAME}'@' /etc/nginx/sites-available/ssl
...
# and add this at the end
exec "$@"

然后将Dockerfile更改为不传递位置参数,但对入口点使用JSON数组语法

ENTRYPOINT ["/etc/nginx/docker-entrypoint.sh"]
CMD ["nginx"]

这应该会让你离开地面。

值得考虑的是,这其中有多少是可配置的。例如,在隔离的容器文件系统空间中,您是否需要一个不同于默认路径的路径?通常,对于标准的nginx Docker Hub映像,您可以通过注入完整的配置文件来使用它,如果您选择这样做,则可以简化Docker设置。

其他通用建议:删除VOLUME声明(它们可能会在Dockerfile中导致混淆行为,泄漏匿名卷,并且没有其他必要);不要使可执行文件全域可写(chmod 0755,而不是0777);RUN apt-get更新

 类似资料:
  • 我试图传递一个参数到一个cmdline工具,它看起来像下面这样: 其中,“()”是工具所必需的,xyz-123存储在变量$var中,我从另一个函数获取该变量。 如果我硬编码“(xyz-123)”,该工具工作正常,但当我执行时,它会抛出一个错误:

  • 我遇到了以下场景 将文件从FTP服务器下载到本地并进行处理 例如:FTPSERVER/dir/file_name= < li >处理后,将FTP服务器中的文件移动到其存档文件夹中 例如:FTPSERVER/dir/file_name= 我必须使用shell脚本来完成这项工作。我已经完成了第一部分使用 ncftpget -u $USER -p $PASS $HOST/DIR/$FILENAME 我不

  • 问题内容: 我需要这个shell脚本一些帮助。我有一个变量,代表一个IP / TCP标头。我需要按所选标题过滤流量捕获。 tcpdump命令的结果如下所示 我需要IP地址源和IP地址目标,在示例中,输出结果必须为 10.0.0.131.58363 > 239.255.255.250.1900 问题答案: 尝试直接在over中执行此操作: 这是坚如磐石的;)

  • 问题内容: 我想运行在命令行(Linux和Mac)上创建的Java程序。我不想一直输入“ java”和参数,因此我正在考虑创建包装器脚本。使它们无处不在的最佳方法是什么?我也希望能够传递参数。我当时正在考虑使用“ shift”执行此操作(删除第一个参数)。 有没有一种更好的方法可以完全不使用脚本呢?也许制作一个不需要通过“ java”命令调用的可执行文件? 问题答案: 假设您使用的是与Bourne

  • 我必须使用Fred的ImageMagick脚本创建图像的过渡序列,特别是fx过渡。 在我的PHP代码中,我将所有的图片调整为标准大小,然后我将所有这些图片重命名为pic000001.jpg,pic000002.jpg,pic000003.jpg等(我用$Count计数),那么我做: (这肯定是脚本生成的消息),然后是如下消息: 因为图片没有生成(它揭示了对帧编号的高维是正确的,所以不要专注于此)。

  • 我正在尝试比较两个存储库中的文件列表,以尝试标记哪些文件已更改。问题是,我的代码说它们都是不同的。但是检查每个哈希摘要表明许多摘要是相同的。 如何修复此bug并仅获取要报告的不同文件? 编辑 另外,请注意使用而不是,如 产生完全相同的错误输出。 编辑2 评论建议使用引号。这也不管用。