【问题标题】:entrypoint: "entrypoint.sh" - docker compose入口点:“entrypoint.sh” - docker compose
【发布时间】:2019-10-17 17:57:57
【问题描述】:

我的工作区中没有名称为 entrypoint.sh 的此类文件。

docker-compose.yml 中的以下指令是指它:

builder: 
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - ../../target:/wheelhouse
  volumes_from:
    - cache
  entrypoint: "entrypoint.sh"
  command: ["pip", "wheel", "--non-index", "-f /build", "."]

../docker/dev/Dockerfile 在哪里

# Set defaults for entrypoint and command string
ENTRYPOINT ["test.sh"]
CMD ["python", "manage.py", "test", "--noinput"]

entrypoint: "entrypoint.sh" 究竟做了什么?

【问题讨论】:

    标签: docker docker-compose dockerfile docker-entrypoint docker-command


    【解决方案1】:

    entrypoint: "entrypoint.sh" 覆盖 Dockerfile 中的 ENTRYPOINT ["test.sh"]

    来自docs

    设置入口点都覆盖在 使用 ENTRYPOINT Dockerfile 指令的服务映像,并清除 输出图像上的任何默认命令 - 这意味着如果有 CMD Dockerfile 中的指令,它会被忽略。

    • ENTRYPOINT ["test.sh"] 设置在 Dockerfile 中描述 docker 镜像

    • entrypoint: "entrypoint.sh" 在 docker-compose 文件中设置,该文件在引用 Dockerfile 时描述多容器环境。

    • docker-compose build builder 将构建镜像并将入口点设置为 Dockerfile 中设置的ENTRYPOINT ["test.sh"]

    • docker-compose up builder 将使用 docker-compose 文件中设置的入口点 entrypoint.sh pip wheel --no-index '-f /build' . 启动容器

    【讨论】:

    • 唯一让我徘徊的是“我的工作区中没有名为 entrypoint.sh 的此类文件。”那么如何覆盖?
    • @Adiii 在基础 Docker 映像 FROM todobackendbase 中有 entrypoint.sh。基础 docker 镜像在文件夹 /usr/local/bin 中复制 entrypoint.sh
    【解决方案2】:

    ENTRYPOINT 是运行 docker 容器时执行的命令或脚本。

    如果您在docker-compose.yaml 中指定entrypoint,它将覆盖指定Dockerfile 中的ENTRYPOINT

    CMD 是作为参数传递给ENTRYPOINT的东西

    所以如果你只运行dev/Dockerfile,它就会执行

    test.sh python manage.py test --noinput

    如果您像以前那样在docker-compose.yaml 中覆盖CMD,它将执行

    test.sh pip wheel --non-index -f /build .

    但是因为你还在docker-compose.yaml 中覆盖了ENTRYPOINT,所以它会执行

    entrypoint.sh pip wheel --non-index -f /build .

    所以基本上,entrypoint.sh 是一个脚本,当您执行 docker-compose up 命令时,它将在您的容器 builder 中运行。

    您也可以查看此答案以获取更多信息What is the difference between CMD and ENTRYPOINT in a Dockerfile?

    【讨论】:

      【解决方案3】:

      更新: 如果基础镜像有entrypoint.sh,它将运行它,但如果你用自己的入口点覆盖,那么容器将运行覆盖入口点。

      如果你要覆盖基础镜像的默认行为,那么你可以改变,否则你不需要从 docker-compose 覆盖它。

      entrypoint: "entrypoint.sh" 究竟做了什么?

      这完全取决于 entrypoint.sh 中的脚本或命令,但可以考虑的东西很少。

      ENTRYPOINT 指令允许您配置一个容器,该容器将 作为可执行文件运行。它看起来类似于 CMD,因为它还允许 您可以指定带有参数的命令。不同之处在于入口点 当 Docker 容器运行时,命令和参数不会被忽略 命令行参数。 (有一种方法可以忽略ENTTRYPOINT,但它 你不太可能会这样做。)

      简单来说,入口点可以是一个复杂的 bash 脚本,例如在 mysql entrypoint 的情况下,它超过 200 LOC,它执行以下任务。

      • 启动 MySQL 服务器
      • 等待 MySQL 服务器启动
      • 创建数据库
      • 可以执行数据库迁移或数据库初始化

      使用 CMD 无法完成这么多复杂的任务,因为在 CMD 中您可以运行 bash,但让它工作起来会更令人头疼。它还使 Dockerfile 变得简单,并将复杂的任务放到入口点。

      当有入口点时,传递给 CMD 的任何内容都将被视为入口点的参数。

      在您的情况下,CMD 是CMD ["python", "manage.py", "test", "--noinput"],它将作为参数传递,运行它的最佳方法是使用 use

      # set of command
      #start long running process at the end that is passed from CMD
      exec "$@"
      

      最后,exec shell 构造被调用,所以最后 给定的命令成为容器的 PID 1。$@ 是一个 shell 变量 这意味着“所有的论点”,

      use-a-script-to-initialize-stateful-container-data

      cmd-vs-entrypoint

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多