在Dockerfile中使用sudo(Alpine)

时间:2018-03-11 22:51:55

标签: linux docker docker-compose dockerfile pm2

我有这个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

如何使用CMD执行sudo命令?

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

2 个答案:

答案 0 :(得分:3)

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

RUN apk add --no-cache su-exec

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

exec su-exec <my-user> <my command>

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

RUN set -ex && apk --no-cache add sudo

之后,您可以使用sudo

sudo -u <my-user> <my command>

答案 1 :(得分:0)

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

如果将上游映像配置为以非root用户身份运行(不太可能因为在构建过程中运行了apk命令),则可以在Dockerfile中指定USER root,随后的所有步骤将默认情况下以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之类的工具)并同时提高安全性。