CMD 不在 Dockerfile 中的 ENTRYPOINT 之后运行

2024-03-16

所以我有一个 docker 文件,它可以执行以下操作:

ENV ENV ${ENV}
ENV SERVICE_NAME ${SERVICE_NAME}
USER app
ENV HOME=/home/app
COPY target /home/app/target
COPY entrypoint.sh /home/app
WORKDIR /home/app
ENTRYPOINT /usr/bin/chamber exec ${ENV}_${SERVICE_NAME} -r 1 -- ./entrypoint.sh
CMD java -jar -Dspring.profiles.active=docker target/my.jar

因此,ENTRYPOINT 运行并从 AWS 参数存储中提取一些机密,并将它们作为环境变量填充到entrypoint.sh shell 中。然后,entrypoint.sh 对它们执行一些操作,创建一些文件等,并在最后一行执行“exec $@”。

然后我期望 CMD 运行,但它所能看到的只是运行“ExecStop=/usr/bin/docker stop app”的 systemd 服务文件。

systemd 服务文件执行以下操作来启动容器:

ExecStart=/usr/bin/docker run --name app --memory-reservation=128m --memory=512m -e ENV=dev -e SERVICE_NAME=app 1234567890.dkr.ecr.eu-west-2.amazonaws.com/app:latest

CMD 发生了什么?


如记录在https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact,如果你结合“壳形式”CMD and ENTRYPOINT, the CMD规范省略:

所以你应该使用“exec form”并编写如下内容:

…
ENTRYPOINT ["/usr/bin/chamber", "exec", "${ENV}_${SERVICE_NAME}", "-r", "1", "--", "./entrypoint.sh"]
CMD ["java -jar", "-Dspring.profiles.active=docker", "target/my.jar"]

However 这不会按原样工作,因为${ENV} and ${SERVICE_NAME}不会被扩展(因为需要 shell)。

因此,这里应用的最简单、正确的解决方案是重构你的entrypoint.sh,或者如果您不想更改它并且仍然依赖具有“exec form”的环境变量ENTRYPOINT,你可以这样写:

…
RUN chmod a+x entrypoint1.sh
ENTRYPOINT ["./entrypoint1.sh"]
CMD ["java -jar", "-Dspring.profiles.active=docker", "target/my.jar"]

有一个文件

入口点1.sh

#!/bin/bash
exec /usr/bin/chamber exec ${ENV}_${SERVICE_NAME} -r 1 -- ./entrypoint.sh "$@"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMD 不在 Dockerfile 中的 ENTRYPOINT 之后运行 的相关文章

随机推荐