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

时间:2019-10-17 17:57:57

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

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

3 个答案:

答案 0 :(得分:1)

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

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

CMD是作为参数传递给ENTRYPOINT

的东西

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

test.sh python manage.py test --noinput

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

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

但是由于您还覆盖了ENTRYPOINT中的docker-compose.yaml,因此它将执行

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

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

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

答案 1 :(得分:1)

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

来自docs

  

设置入口点均会覆盖在上设置的任何默认入口点   服务的图片包含ENTRYPOINT Dockerfile指令,并清除了   删除图像上的任何默认命令-这意味着如果有CMD   指令在Dockerfile中被忽略。

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

  • 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' .启动容器

答案 2 :(得分:0)

更新: 如果基础映像具有entrypoint.sh,它将运行该映像,但是如果您使用自己的入口点进行覆盖,则容器将运行覆盖入口点。

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

入口点:“ entrypoint.sh”实际上起什么作用?

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

  

ENTRYPOINT指令允许您配置一个容器,该容器将   作为可执行文件运行。它看起来类似于CMD,因为它还允许   您可以指定带有参数的命令。区别是ENTRYPOINT   当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构造,以便最终   给定的命令将成为容器的PID1。$@是一个shell变量   表示“所有参数”,

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

cmd-vs-entrypoint