12

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"

4

3 回答 3

8

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

文档

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

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

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

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

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

于 2019-10-17T19:15:22.680 回答
3

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

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

CMD是作为参数传递给ENTRYPOINT

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

test.sh python manage.py test --noinput

如果您像以前那样覆盖CMDdocker-compose.yaml它将执行

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

但是因为你也覆盖ENTRYPOINT了你的docker-compose.yaml,它会执行

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

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

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

于 2019-10-17T18:48:24.643 回答
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 的任何内容都将被视为入口点的参数。

在您的情况下, CMDCMD ["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 变量,表示“所有参数”,

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

cmd-vs-入口点

于 2019-10-17T18:49:22.800 回答