docker_practice/image/dockerfile/user.md

27 lines
1.2 KiB
Go
Raw Normal View History

### USER 指定当前用户
格式`USER <用户名>[:<用户组>]`
`USER` 指令和 `WORKDIR` 相似都是改变环境状态并影响以后的层`WORKDIR` 是改变工作目录`USER` 则是改变之后层的执行 `RUN`, `CMD` 以及 `ENTRYPOINT` 这类命令的身份
当然 `WORKDIR` 一样`USER` 只是帮助你切换到指定用户而已这个用户必须是事先建立好的否则无法切换
```docker
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]
```
如果以 `root` 执行的脚本在执行期间希望改变身份比如希望以某个已经建立好的用户来运行某个服务进程不要使用 `su` 或者 `sudo`这些都需要比较麻烦的配置而且在 TTY 缺失的环境下经常出错建议使用 [`gosu`](https://github.com/tianon/gosu)。
```docker
# 建立 redis 用户并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis
# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64" \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true
# 设置 CMD并以另外的用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]
```