簡體   English   中英

Dockerfile中的ENTRYPOINT之后CMD無法運行

[英]CMD doesn't run after ENTRYPOINT in 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.sh
CMD java -jar -Dspring.profiles.active=docker target/my.jar

因此,ENTRYPOINT運行並從AWS Parameter存儲中提取了一些秘密,並將其作為環境變量填充到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中所述 ,如果您將CMDENTRYPOINT的“外殼形式”組合在一起,則會省略CMD規范:

摘自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 "$@"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM