我有这个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用户使用。
答案 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之类的工具)并同时提高安全性。