【问题标题】:Confused about CMD/ENTRYPOINT in Dockerfile对 Dockerfile 中的 CMD/ENTRYPOINT 感到困惑
【发布时间】:2020-01-13 09:45:37
【问题描述】:

我不确定ENTRYPOINTCMD 分别用于下面的Dockerfile 什么。

FROM mongo:3.4-xenial

RUN apt-get update
RUN apt-get install -y software-properties-common
RUN apt-get install zip \
    unzip
RUN apt-get install -y default-jdk
RUN apt-get update -y && \
    apt-get clean

RUN mkdir -p /opt/project

COPY ./project-repo/target/project-repo.zip /opt/project

WORKDIR /opt/project 
RUN unzip project-repo.zip

ENTRYPOINT echo '#!/bin/bash\n\
    pidfile="${TMPDIR:-/tmp}/docker-entrypoint-temp-mongod.pid" \n\
    rm -f "$pidfile" \n\
    # start MongoDB here \n\
    mongod --logpath /var/log/mongodb.log --dbpath /data/db/ --fork --pidfilepath "$pidfile" \n\
    mongo=( mongo --host 127.0.0.1 --port 27017 --quiet ) \n\
    # check to see that our "mongod" actually did start up (catches "--help", "--version", MongoDB 3.2 being silly, slow prealloc, etc) \n\
    # https://jira.mongodb.org/browse/SERVER-16292 \n\
    tries=30 \n\
    while true; do \n\
        if ! { [ -s "$pidfile" ] && ps "$(< "$pidfile")" &> /dev/null; }; then \n\
            # bail ASAP if "mongod" is not even running \n\
            echo >&2 \n\
            echo >&2 "error: mongod does not appear to have stayed running -- perhaps it had an error?" \n\
            echo >&2 \n\
            exit 1 \n\
        fi \n\
        if mongo admin --eval "quit(0)" &> /dev/null; then \n\
            # success! \n\
            break \n\
        fi \n\
        (( tries-- )) \n\
        if [ "$tries" -le 0 ]; then \n\
            echo >&2 \n\
            echo >&2 "error: mongod does not appear to have accepted connections quickly enough -- perhaps it had an error?" \n\
            echo >&2 \n\
            exit 1 \n\
        fi \n\
        sleep 1 \n\
    done \n\
    mongo -- admin <<-EOF \n\
    db.createUser({user:"user", pwd:"admin123", roles:[{role:"root", db:"admin"}]}); \n\
EOF' >> ./init_mongo.sh && chmod +x ./init_mongo.sh && ./init_mongo.sh && \
    chmod +x /opt/project/setup.sh && /opt/project/setup.sh all && \
    chmod +x /opt/project/start.sh && /opt/project/start.sh all

EXPOSE 8080

CMD ["echo 'Welcome to Demo'"]

我的 MongoDB 初始化是基于标准图像提供的。他们使用mongod 作为CMD

我需要一些东西 - 启动 mongo,创建用户然后运行我的脚本 - 设置并启动。

没有错误。然而,在ENTRYPOINT 完成它的事情之后,容器就退出了。我希望它继续运行!!!

我猜我的CMD 是错误的。请指教。

谢谢

【问题讨论】:

    标签: mongodb docker dockerfile


    【解决方案1】:

    ENTRYPOINT 完成操作后,容器就退出了。

    这是一个普遍的事实:容器的生命周期正是 ENTRYPOINT 的生命周期,或者没有 CMD 的生命周期。

    就风格而言,不要尝试在 Dockerfile 中编写像内联那样很长的脚本。让它成为一个单独的文件,COPY 到镜像中,确保它是可执行的,然后直接运行它。

    另一个风格点是,在构建的镜像中获取调试 shell 非常有用,例如

    docker run --rm -it imagename bash
    

    但是,该表单只会覆盖CMD。这意味着您通常应该将要运行的命令专门放在CMD 中。由于这将是容器的主要进程,因此它必须与容器一样长时间保持运行;它不能像start.shservice start 这样尝试在后台启动它并立即返回。例如,

    CMD ["/opt/project/myservice", "--foreground"]
    

    那么ENTRYPOINT 有什么好处呢?如果您同时拥有ENTRYPOINTCMD,则ENTRYPOINT 将使用CMD 作为命令行参数运行。一个非常常见的模式是编写一个脚本来执行一些初始设置,然后执行exec "$@" 来运行命令部分。从你的例子中,

    #!/bin/sh
    ./init_mongo.sh
    exec "$@"
    

    你组合的 Dockerfile 看起来或多或少像

    FROM ubuntu:18.04
    # ... other setup bits ...
    WORKDIR /opt/project
    COPY entrypoint.sh init_mongo.sh .
    RUN chmod +x entrypoint.sh init_mongo.sh
    ENTRYPOINT ["/opt/project/entrypoint.sh"]
    CMD ["/opt/project/myservice", "--foreground"]
    

    【讨论】:

    • 我从stackoverflow.com/questions/57891045/… 尝试了CMD exec /bin/bash -c "trap : TERM INT; sleep infinity &amp; wait",但它对我没有任何作用。容器仍然存在,日志中没有任何内容。
    • 你为什么想要一个永远休眠的容器?将您的实际服务作为前台进程启动。 (提示:CMD foo bar 隐含在 sh -c 中,您不需要自己包含它。)
    • 我正在以“DevOps”的身份行事,如果你愿意的话……这个项目有很多服务。该项目已经存在了一段时间,我不是开发人员之一。我希望整个事情在 docker 下运行。如果我正确理解了这个问题,我的问题是 PID 1 的容器进程。如果sleep infinity 工作,我的其他进程,通过ENTRYPOINT 启动将继续在后台运行。他们不会吗?如果是这样的话,我只需要弄清楚如何让前台运行。为什么不:#!/bin/bash\n while true; do echo 'Hit CTRL+C'; sleep 10; done 和这样的工作?
    • 通常你会为每个容器运行一项服务。如果您可以将它们拆分为单独的映像,有时可以更容易维护,但即使没有,也很容易使用不同的主进程命令从同一个映像运行多个容器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2012-07-22
    • 2013-05-13
    • 2020-04-16
    • 2023-03-08
    • 2019-08-04
    • 2019-12-30
    相关资源
    最近更新 更多