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