docker run 没有入口点

kzf*_*fid 9 docker docker-entrypoint

我们可以有一个没有入口点的 {docker run} 命令吗?据我所知,必须有一个入口点(如果未指定,则在大多数情况下应默认为“bash”)。否则,我无法将图像作为容器运行。

假设我在物理机上安装 Linux。
有一个后台服务在后台运行,监听端口然后做一些事情。
在我登录之前,没有运行 bash shell,我仍然可以通过名称和端口从另一台计算机调用后台服务。

我可以通过 {docker run} 做类似的事情吗?这意味着,我不需要入口点(或者入口点是系统进程而不是 bash?),只需让容器系统及其后台服务启动并运行即可。

Dav*_*aze 11

如果您的docker run容器没有任何特殊的入口点或命令选项,它将运行由其图像ENTRYPOINTCMD指令指定的单个命令。这应该是运行容器的常用方式。例如:

# Launches a PostgreSQL server, without manually specifying a command
docker run \
  -d -p 5432:5432 -v pgdata:/var/lib/postgresql/data \
  postgres:14
Run Code Online (Sandbox Code Playgroud)

图像名称后面放置的任何内容都会覆盖CMD图像中的 。您可以使用它进行各种有用的调试,或者在同一代码库上运行多个容器。

docker build -t django-image .

# What's in that image?
docker run --rm django-image \
  ls -l /app

# Get an interactive shell in a temporary container
docker run --rm -it django-image \
  bash

# Launch the Django server normally
docker run -d --name web -p 8000:8000 django-image

# Also launch a Celery worker off that same image
docker run -d --name worker django-image \
  celery worker
Run Code Online (Sandbox Code Playgroud)

您通常不需要该docker run --entrypoint选项。由于它是一个 Docker 选项,因此它需要出现在映像名称之前,并且它所采用的任何选项都出现在映像名称之后的“命令”槽中。

# This syntax is awkward, design to avoid it
docker run --rm \
  --entrypoint ls \
  django-image \
  -l /app
Run Code Online (Sandbox Code Playgroud)

在你的 Dockerfile 中ENTRYPOINT是完全可选的。如果您认为您将需要上面建议的任何命令覆盖形式(包括初始开发期间的调试),请优先设置CMD和 not 。ENTRYPOINT

# no ENTRYPOINT
CMD python ./manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

不要设置ENTRYPOINT为像这样的解释器python,并将命令的其余部分放入CMD; 这显然是有效的,但将命令限制为仅 Python 脚本,因此您被迫对docker run --entrypoint其他任何内容进行尴尬的设置。

如果你确实 set ENTRYPOINT,我发现最有用的设置是让它成为一个包装器 shell 脚本,它执行一些初始设置,然后以exec "$@"运行任何内容结束CMD。即使对于各种命令覆盖形式,这也适用,这些形式仍然运行包装器脚本,但最后运行用户提供的命令。DockerfileENTRYPOINT必须是 JSON 数组(“exec 语法”)才能正常工作。

我的一个例外是在为 Go 程序构建微图像时,除了编译的程序本身之外,实际上不包含任何内容。镜像中既没有 shell,也没有任何其他工具,除了运行一个程序之外,无法执行任何操作。仅在这种情况下,我将设置ENTRYPOINT为已编译的二进制文件的路径;它仍然必须是一个 JSON 数组。


BIP*_*DOL -2

您不需要任何入口点来运行 docker 映像。您可以按照命令运行图像。如果您的 dockerfile 默认包含入口点,则将其删除。

docker run image_name
Run Code Online (Sandbox Code Playgroud)

还可以在此处共享 docker 文件,这可能会帮助人们更好地回答您的问题。