在Dockerfile中使用sudo(Alpine)

rid*_*nsb 4 linux docker pm2 dockerfile docker-compose

我有这个Dockerfile ...

FROM keymetrics/pm2:latest-alpine

RUN apk update && \
    apk upgrade && \
    apk add \
       bash

COPY . ./

EXPOSE 1886 80 443

CMD pm2-docker start --auto-exit --env ${NODE_ENV} ecosystem.config.js
Run Code Online (Sandbox Code Playgroud)

如何CMD使用执行命令sudo

我需要这样做,因为仅sudo用户允许使用端口443。

BMi*_*tch 27

Sudo 通常不随 Alpine 映像一起提供,将它包含在任何容器中几乎没有意义。您需要的不是 sudo 绑定到低编号端口,而是 root 用户本身,而 sudo 只是在多用户环境中获得 root 访问权限的常用方法。如果容器包含 sudo,则您需要为用户设置密码,或者允许命令在没有密码的情况下运行。无论您选择哪个,您现在都在容器内进行了权限提升,这违背了以普通用户身份运行容器的目的,因此此时您也可以以 root 身份运行容器。

如果上游镜像被配置为以非 root 用户身份运行(不太可能,因为你apk在构建过程中运行命令),你可以USER root在你的 Dockerfile 中指定,默认情况下,以下所有步骤都将以 root 身份运行,包括容器入口点/cmd。

如果您以不同的用户身份启动您的容器,例如docker run -u 1000 your_image,然后以 root 身份运行您的命令,您将删除该-u 1000选项。如果您在限制容器以非 root 用户身份运行的更高安全性环境中运行容器,这可能是一个问题。

如果您的应用程序本身正在放弃 root 权限,那么包含 sudo 不太可能没有帮助,除非应用程序本身在内部调用 sudo。如果是这种情况,请在绑定到端口后更新应用程序以删除 root 权限。

最重要的是,如果你的容器内 root 的唯一原因是绑定到低编号端口,那么在容器内配置你的应用程序以绑定到高编号端口,例如 8080 和 8443。你可以将此容器端口映射到任何端口主机包括80和443,所以外界看不到任何影响。例如docker run -p 80:8080 -p 443:8443 your_image。这可以简化您的映像(删除 sudo 等工具)并同时提高您的安全性。

  • 谢谢 !有时我们所寻找的并不是我们真正需要的。我就是这种情况,你的解释对我帮助很大! (5认同)

Ger*_*and 11

su-exec可以在高山中使用。将其添加到软件包中,如果尚不可用,则将以下内容添加到您的Dockerfile中

RUN apk add --no-cache su-exec
Run Code Online (Sandbox Code Playgroud)

在将要在docker中运行的脚本中,您可以使用以下命令成为另一个用户:

exec su-exec <my-user> <my command>
Run Code Online (Sandbox Code Playgroud)

或者,您可以在构建docker-file时添加更多familiair sudo包将以下内容添加到FROM高山的Dockerfile中

RUN set -ex && apk --no-cache add sudo
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用sudo

sudo -u <my-user> <my command>
Run Code Online (Sandbox Code Playgroud)

  • 我的高山容器中没有su-exec。我必须修改其Dockerfile使其包括:RUN apk add --no-cache su-exec。sudo并没有帮助我,因为它询问了我不知道的用户密码。 (2认同)