Docker 启动指定用户名

Docker 是一个开源的应用容器引擎,可以将应用程序和其依赖项打包为容器,提供了简单、轻量级、可移植和自包含的环境。在使用 Docker 启动容器时,默认情况下会使用 root 用户身份运行容器中的应用程序。然而,为了加强容器的安全性,我们可能希望以非特权用户身份运行容器。本文将介绍如何使用 Docker 启动指定用户名的容器,并提供相应的代码示例。

1. 创建一个用户映像

首先,我们需要创建一个包含所需程序和文件的用户映像。在本示例中,我们将使用一个简单的 Node.js 应用程序作为演示。

1.1 编写 Dockerfile

在项目根目录下创建一个名为 Dockerfile 的文件,并将以下内容添加到文件中:

FROM node:latest

# 创建一个新用户
RUN useradd -ms /bin/bash myuser

# 将工作目录设置为用户目录
WORKDIR /home/myuser/app

# 拷贝应用程序文件到容器中
COPY . .

# 更改文件所有者为新用户
RUN chown -R myuser:myuser /home/myuser

# 切换到新用户
USER myuser

# 安装应用程序依赖项
RUN npm install

# 暴露容器的端口
EXPOSE 3000

# 启动应用程序
CMD ["npm", "start"]

上述 Dockerfile 中的关键步骤包括:

  • 使用 FROM 指令选择一个基础映像,本示例中选择了官方的 Node.js 映像。
  • 使用 useradd 命令创建一个新用户,并使用 -ms 参数指定用户的 shell 为 /bin/bash
  • 使用 WORKDIR 指令设置工作目录为新用户的目录。
  • 使用 COPY 指令将应用程序文件复制到容器中。
  • 使用 chown 命令更改文件的所有者为新用户。
  • 使用 USER 指令切换到新用户。
  • 使用 RUN 命令安装应用程序的依赖项。
  • 使用 EXPOSE 指令暴露容器的端口。
  • 使用 CMD 指令指定容器启动时要执行的命令。

1.2 构建用户映像

在命令行中,使用以下命令在当前目录下构建用户映像:

$ docker build -t myapp .

2. 启动容器

完成用户映像的构建后,我们可以使用该映像启动容器。在启动容器时,我们需要指定运行容器的用户名。

2.1 编写启动脚本

在项目根目录下创建一个名为 start.sh 的文件,并将以下内容添加到文件中:

#!/bin/bash

docker run -d \
  -p 8080:3000 \
  --name myapp \
  --user myuser \
  myapp

上述脚本中的关键参数包括:

  • -d 参数表示以后台模式启动容器。
  • -p 参数将容器的端口 3000 映射到主机的端口 8080。
  • --name 参数指定容器的名称。
  • --user 参数指定容器中应用程序的运行用户。
  • myapp 为用户映像的名称。

2.2 启动容器

在命令行中,使用以下命令执行启动脚本:

$ chmod +x start.sh
$ ./start.sh

3. 验证容器运行

成功启动容器后,我们可以验证容器是否以指定的用户名运行。

3.1 进入容器

在命令行中,使用以下命令进入容器的 shell:

$ docker exec -it myapp /bin/bash

3.2 验证用户名

在容器的 shell 中,我们可以使用以下命令验证容器中的用户名:

$ whoami

如果输出为 `myuser