【问题标题】:How does EntryPoint Works in Docker?EntryPoint 在 Docker 中是如何工作的?
【发布时间】:2021-08-26 16:08:21
【问题描述】:

我的 DockerFile 如下所示:

FROM maven:2.3.4-jdk-8
  
COPY ./docker-entrypoint.sh /

ENTRYPOINT ["/docker-entrypoint.sh"]
.................................

和 docker-entrypoint.sh 看起来像

#!/bin/bash
umask 0011
/bin/bash

现在我在网上看到,entryPoint 是 docker run 命令运行时默认执行的语句。

如果我这样做:

1. docker run -it imageid

不应该打开 bash 因为 /bin/bash 是入口点中的默认语句吗?

But instead it does follow:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.121 s
[INFO] Finished at: 2021-06-09T15:51:18+00:00
[INFO] Final Memory: 5M/59M
[INFO] ------------------------------------------------------------------------
[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]
[ERROR] 
  1. docker run -itd imageid bash 它启动容器。那么bash到底要做什么呢?是不是和之前的命令一样?

  2. 为什么第二条语句没有向我显示 bash 提示符。为什么它必须通过 docker exec 命令来?

【问题讨论】:

  • 你是如何构建这个图像的?我没有看到 maven:2.3.4-jdk-8 基本图像
  • 确保您的最小示例可以重现。
  • 这个 Dockerfile 应该是可构建的。如上所述,您是如何构建它的?
  • 我正在使用 docker build 命令构建

标签: bash docker maven docker-compose dockerfile


【解决方案1】:

如果您同时指定ENTRYPOINTCMD

  • ENTRYPOINT 是可执行文件
  • CMD(作为数组)是可执行文件的参数

如果你只指定CMD:

  • 作为字符串(例如CMD echo "This is a test." | wc -),它在shell中运行
  • 作为一个数组(例如CMD ["/usr/bin/wc", "--help"]),它在没有外壳的情况下运行

这是一个运行 shell 脚本的示例:

FROM ubuntu:20.04

WORKDIR /app
COPY ./example.sh .

CMD ["./example.sh"]

【讨论】:

    【解决方案2】:

    阅读 Docker 文档后, ENTRYPOINT has two forms:

    exec 形式,这是首选形式:

    ENTRYPOINT ["executable", "param1", "param2"] 外壳形式:

    ENTRYPOINT command param1 param2

    如果你使用 shell 形式,ENTRYPOINT 命令将是/bin/bash 的子命令,并且不会接收信号,并且 PID 为 1,不会接收 Unix 信号,并且不会接收来自 ` 的 SIGTERN docker stop 命令。

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 2021-04-04
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多