CMD不';t在Dockerfile中的入口点后运行

CMD不';t在Dockerfile中的入口点后运行,docker,dockerfile,Docker,Dockerfile,所以我有一个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.s

所以我有一个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怎么了?

如中所述,如果将
CMD
的“外壳形式”与
ENTRYPOINT
结合起来,则
CMD
规范将被省略:

因此,您应该使用“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\u NAME}
(因为需要一个shell)

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

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

entrypoint1.sh


它实际上是exec格式的,但我真的需要chamber为我获取的变量,或者entrypoint.sh不会做太多。@SnazzyBootMan我不明白你的意思:你的问题中的entrypoint是shell格式的。但是如果不想更改entrypoint.sh,可以使用一个额外的entrypoint1.sh来处理变量扩展。。。我将编辑我的答案来解释这一点。之前,它是以exec形式编写的,在任务定义中与Amazon ECS配合良好,这可能会过度编写CMD,并使用大量变量填充环境。启动entrypoint.sh时是否会生成新的shell?环境变量需要全程维护。@SnazzyBootMan是的,准确地说:(1)为了能够使用
CMD
指令,必须使用
ENTRYPOINT[“program”,“arg1”,“…]
,而不是
ENTRYPOINT程序arg1…
;(2) 如果您只编写
ENTRYPOINT[“/ENTRYPOINT.sh”]
并且
ENTRYPOINT.sh
具有可执行标志(
运行chmod a+x ENTRYPOINT.sh
),并且
ENTRYPOINT.sh
以适当的shebang开头,那么将按照预期生成一个shell,并扩展其中的环境变量;(3) 最后,您的入口点脚本应该包含一些代码来读取
CMD
参数(请参阅我的答案中的
“$@”
)。答案很好,我今天尝试了这个,但遇到了一些问题。读了你最后的评论,我现在明白了为什么我要用Alpine(我刚才才提到)作为容器图像,所以复制和粘贴你的答案是行不通的,因为没有使用“适当的shebang”。替换#/用#打垃圾桶/垃圾桶/灰烬起作用了,因为我刚才只提到了这个你不知道的东西。
#!/bin/bash
exec /usr/bin/chamber exec ${ENV}_${SERVICE_NAME} -r 1 -- ./entrypoint.sh "$@"