繁体   English   中英

入口点:“entrypoint.sh” - docker 撰写

[英]entrypoint: “entrypoint.sh” - docker compose

我的工作区中没有名为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"实际上是做什么的?

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

如果您在docker-compose.yaml中指定entrypoint点,它将覆盖来自指定ENTRYPOINTDockerfile

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

因此,如果您只运行dev/Dockerfile ,它将执行

test.sh python manage.py test --noinput

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

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

但是因为您还覆盖ENTRYPOINT中的docker-compose.yaml ,所以它将执行

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

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

您也可以查看此答案以获取更多信息Dockerfile 中的 CMD 和 ENTRYPOINT 有什么区别?

入口点entrypoint: "entrypoint.sh"覆盖来自 Dockerfile 的ENTRYPOINT ["test.sh"]

文档

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

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

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

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

  • docker-compose up builder将使用入口entrypoint.sh pip wheel --no-index '-f /build'. 在 docker-compose 文件中设置

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

如果您要覆盖基本映像的默认行为,那么您可以更改,否则您不需要从 docker-compose 覆盖它。

entrypoint: "entrypoint.sh" 实际上是做什么的?

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

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

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

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

CMD 无法完成如此复杂的任务,就像在 CMD 中一样,您可以运行 bash,但让它工作起来会更令人头疼。 它还使 Dockerfile 变得简单,并将复杂的任务放到入口点。

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

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

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

最后,调用 exec shell 构造,以便给定的最终命令成为容器的 PID 1。 $@是 shell 变量,表示“所有参数”,

使用脚本来初始化有状态容器数据

cmd-vs-入口点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM