CMD不';t在Dockerfile中的入口点后运行
所以我有一个docker文件,它可以: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
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 "$@"