入口点:"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,它将覆盖指定 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?

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

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

入口点:"entrypoint.sh" 实际做什么?

完全取决于entrypoint.sh里面的脚本或者命令,但是可以考虑的东西很少

ENTRYPOINT instruction allows you to configure a container that will run as an executable. It looks similar to CMD, because it also allows you to specify a command with parameters. The difference is ENTRYPOINT command and parameters are not ignored when Docker container runs with command line parameters. (There is a way to ignore ENTTRYPOINT, but it is unlikely that you will do it.)

简单来说,入口点可以是一个复杂的 bash 脚本,例如 mysql entrypoint 超过 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 "$@"

Finally, the exec shell construct is invoked, so that the final command given becomes the container's PID 1. $@ is a shell variable that means "all the arguments",

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

cmd-vs-entrypoint

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

来自docs

Setting entrypoint both overrides any default entrypoint set on the service’s image with the ENTRYPOINT Dockerfile instruction, and clears out any default command on the image - meaning that if there’s a CMD instruction in the Dockerfile, it is ignored.

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

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