entrypoint: “entrypoint.sh” - docker compose

entrypoint: "entrypoint.sh" - docker compose

提问人:overexchange 提问时间:10/18/2019 最后编辑:rokoverexchange 更新时间:10/18/2019 访问量:74307

问:

我的工作区中没有这样的文件。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 -命令

评论


答:

4赞 Tomas Bruckner 10/18/2019 #1

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

如果在 中指定,则会覆盖指定的 。entrypointdocker-compose.yamlENTRYPOINTDockerfile

CMD是作为参数传递给ENTRYPOINT

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

test.sh python manage.py test --noinput

如果您像您所做的那样覆盖,它将执行CMDdocker-compose.yaml

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

但是因为你也覆盖了你的,所以它将执行ENTRYPOINTdocker-compose.yaml

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

所以基本上,是一个脚本,当你执行命令时,它将在你的容器内运行。entrypoint.shbuilderdocker-compose up

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

3赞 Adiii 10/18/2019 #2

更新:如果基础映像具有 ,它将运行该入口点,但如果您使用自己的入口点进行覆盖,则容器将运行覆盖入口点。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-入口点

评论

0赞 overexchange 10/18/2019
与docker-compose stackoverflow.com/questions/58439706/ 相关...
13赞 rok 10/18/2019 #3

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

文档中:

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

  • 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' .

评论

1赞 Adiii 10/18/2019
唯一让我徘徊的是“我的工作区中没有这样的文件名称 entrypoint.sh”,那么如何覆盖?
2赞 overexchange 10/18/2019
@Adiii 在基本 docker 映像中。文件夹中的基本 docker 映像副本entrypoint.shFROM todobackendbaseentrypoint.sh/usr/local/bin