入口点:"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",
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' .
来启动容器
我的工作区中没有名称为 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",
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 imageentrypoint: "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' .
来启动容器