gpt4 book ai didi

docker - CMD 在 Dockerfile 中的 ENTRYPOINT 后不运行

转载 作者:行者123 更新时间:2023-12-02 18:48:14 27 4
gpt4 key购买 nike

所以我有一个 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 Parameter Store 中提取一些 secret ,并将它们作为环境变量填充到 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 中所述,如果结合CMD的“ shell 形式”和 ENTRYPOINT , CMD规范省略:

Exerpt from docs.docker.com

因此,您应该使用“exec 形式”并编写如下内容:


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

然而 这将无法正常工作 ,因为 ${ENV}${SERVICE_NAME}不会被扩展(因为需要一个 shell)。

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

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

带文件

entrypoint1.sh


#!/bin/bash
exec /usr/bin/chamber exec ${ENV}_${SERVICE_NAME} -r 1 -- ./entrypoint.sh "$@"

关于docker - CMD 在 Dockerfile 中的 ENTRYPOINT 后不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54447913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com