在 2020 年使用 docker-compose 以 root 身份运行命令?

Szc*_*ski 4 docker docker-compose

在苦心塑造 Dockerfile 和 docker-compose.yml 的过程中,为了调试问题,在正在进行的容器中运行 root shell 的正确方法是什么(无需实际启动它们的服务!)?我需要能够以 root 身份运行 shell,因为只有 root 才能完全访问包含我需要检查的信息的文件。

可以修改 Dockerfile 和 docker-compose.yml 来实现这个目标;正如我上面写的,无论如何我都在雕刻这些。

然而,问题是我能想到的唯一方法是放入USER rootDockerfile 或user: rootdocker-compose.yml,但在docker-compose run <service> bash场景中放入 SimpleHaveNoEffect™ 。whoami在 shell 中,因此开始说,neo4j而不是root,无论我尝试什么。

可能会添加sudo到没有的图像中,sudo但这应该被视为最后的手段。也直接使用 docker 而不是 docker-compose 不太可取。

Dav*_*aze 7

在容器中启动 shell 的所有命令(包括,例如,docker-compose run有一个--user选项,因此您可以为调试 shell 指定任意用户。

docker-compose run -u root <service> bash
Run Code Online (Sandbox Code Playgroud)

如果您正在调试镜像构建,请注意每个构建步骤都会生成一个镜像,您可以在该镜像上运行调试 shell。(例如,检查步骤之前的RUN步骤以查看文件系统在执行之前的样子,或在执行之后查看其结果。)

$ docker build .
...
Step 7/9 : RUN ...
 ---> Using cache
 ---> 55c91a5dca05
...
$ docker run --rm -it -u root 55c91a5dca05 bash
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,命令 ( bash) 都会覆盖CMDDockerfile 中的 。如果您有一个ENTRYPOINT仍会运行的包装器脚本,但标准exec "$@"命令将启动您的调试 shell。如果您已将默认命令设为 run as ENTRYPOINT,请将其更改为CMD以更好地支持此用例(以及包装器入口点模式,如果您需要的话)。

如果你真的不能改变Dockerfile,你也可以覆盖ENTRYPOINT,但有点尴尬。

docker run --rm -it -u root --entrypoint ls myimage -al /app
Run Code Online (Sandbox Code Playgroud)