Dockerfile中的ENTRYPOINT之后CMD无法运行

时间:2019-01-30 19:12:30

标签: 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.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发生了什么事?

1 个答案:

答案 0 :(得分:2)

https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact中所述,如果您将CMDENTRYPOINT的“外壳形式”组合在一起,则会省略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 "$@"