我的工作空间中没有名称为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"
实际做什么?
答案 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,可以执行以下任务。
使用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变量 表示“所有参数”,