[英]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
点,它将覆盖来自指定ENTRYPOINT
的Dockerfile
。
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,它执行以下任务。
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 变量,表示“所有参数”,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.