无root在Docker中部署一个Vue应用
因此,您将在 Docker 容器中部署您的 Vue 应用程序。那很棒!!容器是部署应用程序的绝佳方式。当我部署 Vue 应用程序时,我选择nginx作为 Web 服务器。 nginx 可作为来自Dockerhub的 Docker 映像获得,因此您无需做太多即可开始使用。不幸的是,默认实现在 root 用户的上下文中运行。这可能是一个安全问题,尤其是在容器被破坏的情况下。攻击者现在以 root 身份运行。
不幸的是,这并不像在 Dockerfile 中更改用户那么简单。 nginx 镜像以 root 运行的原因是,在 Linux 中,用户必须是 root 才能在端口 80 或 443 上运行应用程序。我们可以对容器进行更改以使其成为可能,但更改很复杂。幸运的是,我们使用的是容器,因此 Web 服务器在容器中运行的实际端口是不相关的。因此,我们可以在任何其他端口(例如 8080)上的非 root 用户上下文中运行应用程序。在运行容器时,如果我们需要将应用程序直接公开到 Internet,我们可以映射回端口 80 或 443 进行生产部署。就我而言,SSL/TLS 证书托管在反向代理或 Kubernetes 入口中,因此我没有在我的 Docker 映像中包含该证书。
我们需要更改的第一件事是 nginx 的主要配置文件。我们希望它在另一个端口上侦听,这次将是 8080。其余配置是默认设置:但如果我们直接在端口 443 上公开应用程序,它可能在那里:
server {
listen 8080;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 400 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
进入全屏模式 退出全屏模式
接下来,我们需要更改 nginx 在其下运行的用户上下文。幸运的是,nginx 人已经想到了这一点,并且已经在默认容器中创建了一个名为 nginx 的用户,因此不需要系统级用户配置。这是完整的 Dockerfile:
FROM nginx:1.19
RUN rm -f /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
RUN chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /var/log/nginx && \
chown -R nginx:nginx /etc/nginx/conf.d
RUN touch /var/run/nginx.pid && \
chown -R nginx:nginx /var/run/nginx.pid
USER nginx
COPY dist /usr/share/nginx/html
EXPOSE 8080
进入全屏模式 退出全屏模式
让我们看一下 Dockerfile 的相关部分。有几个目录,nginx 用户必须拥有日志、缓存和配置的所有权,以及进程 ID 文件:
RUN chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /var/log/nginx && \
chown -R nginx:nginx /etc/nginx/conf.d
RUN touch /var/run/nginx.pid && \
chown -R nginx:nginx /var/run/nginx.pid
进入全屏模式 退出全屏模式
我们接下来设置用户上下文,所以 nginx 在这个用户下运行:
USER nginx
进入全屏模式 退出全屏模式
然后 Dockerfile 将dist文件夹的内容复制到镜像中。这是使用 npm 构建 Vue 应用程序的输出:
COPY dist /usr/share/nginx/html
最后我们设置端口,不能是 80 或 443:
EXPOSE 8080
进入全屏模式 退出全屏模式
现在我们的 Dockerfile 设置为创建一个不以 root 权限运行的容器。该应用程序可以使用 Docker、Kubernetes 入口甚至反向代理在 80 或 443 上运行,其风险比使用默认值小。
更多推荐
所有评论(0)