Skip to content
This repository has been archived by the owner on Mar 23, 2021. It is now read-only.

Commit

Permalink
perf(docker): 优化gosu使用
Browse files Browse the repository at this point in the history
  • Loading branch information
zjZSTU committed Oct 6, 2019
1 parent 10997ab commit 5d33730
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 16 deletions.
16 changes: 16 additions & 0 deletions dockerfiles/gosu/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM zjzstu/ubuntu:18.04
LABEL maintainer "zhujian <zjzstu@github.com>"

WORKDIR /app
RUN set -eux && \
apt-get update && \
apt-get install -y gosu && \
rm -rf /var/lib/apt/lists/* && \
# verify that the binary works
gosu nobody true && \
useradd -s /bin/bash -m user

COPY docker-entrypoint.sh .
RUN chmod a+x docker-entrypoint.sh

ENTRYPOINT ["/app/docker-entrypoint.sh"]
2 changes: 2 additions & 0 deletions dockerfiles/gosu/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

参考:[]
14 changes: 14 additions & 0 deletions dockerfiles/gosu/docker-entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash

if [ "$(id -u)" -eq '0' ]
then
USER_ID=${LOCAL_USER_ID:-9001}

usermod -u ${USER_ID} -g ${USER_ID} user > /dev/null 2>&1
chown -R `id -u user`:`id -u user` /app > /dev/null 2>&1

export HOME=/home/user
exec gosu user "$0" "$@"
fi

exec "$@"
35 changes: 19 additions & 16 deletions docs/source/docker/storage/[gosu]绑定挂载最佳实践.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@

`docker`容器默认使用`root`用户运行,当使用绑定挂载方式将主机文件/目录挂载到容器,容器在挂载点创建的文件的权限/属主/属组均属于`root`

启动容器`zjzstu/ubuntu:18.04`,将主机`$HOME/slides`目录挂载到容器`/project/slides`
启动容器`zjzstu/ubuntu:18.04`,将主机`$HOME/slides`目录挂载到容器`/app/slides`

```
$ docker run -it --rm -v $HOME/slides:/project/slides zjzstu/ubuntu:18.04 bash
$ docker run -it --rm -v $HOME/slides:/app/slides zjzstu/ubuntu:18.04 bash
```

在容器中创建文件`hi.txt`到挂载点

```
# pwd
/project/slides
/app/slides
# ls -al hi.txt
-rw-r--r-- 1 root root 12 Oct 2 05:26 hi.txt
```
Expand All @@ -31,7 +31,7 @@ $ ls -al hi.txt

**文件`hi.txt`属于`root`用户创建的,所以对于当前普通用户而言,无法修改和执行**

## 使用--user参数
## 使用--user

使用`-u, --user`参数能够指定容器运行期间的用户

Expand All @@ -42,7 +42,7 @@ $ docker run --user <name|uid>[:<group|gid>]
将当前普通用户的用户`ID`和组`ID`输入,保证容器和主机在相同用户下运行

```
$ docker run -it --rm -v $HOME/slides:/project/slides --user $UID:$(id -g $USER) zjzstu/ubuntu:18.04 bash
$ docker run -it --rm -v $HOME/slides:/app/slides --user $UID:$(id -g $USER) zjzstu/ubuntu:18.04 bash
groups: cannot find name for group ID 1000
I have no name!@a3a4ce4cc3f4:/$
```
Expand Down Expand Up @@ -71,7 +71,7 @@ I have no name!@a3a4ce4cc3f4:/$

`/etc/passwd`中也无法找到,容器命令无法操作超出用户权限的命令和文件

## gosu使用
## 使用gosu

参考:

Expand Down Expand Up @@ -104,21 +104,19 @@ RUN set -eux; \
FROM zjzstu/ubuntu:18.04
LABEL maintainer "zhujian <zjzstu@github.com>"
WORKDIR /project
WORKDIR /app
RUN set -eux && \
apt-get update && \
apt-get install -y gosu && \
rm -rf /var/lib/apt/lists/* && \
# verify that the binary works
gosu nobody true && \
# 常见用户user
useradd -s /bin/bash -m user && \
chown -R `id -u user` /project
useradd -s /bin/bash -m user
COPY docker-entrypoint.sh .
RUN chmod a+x docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
ENTRYPOINT ["/app/docker-entrypoint.sh"]
```

安装`gosu`,创建用户`user`,最后设置启动脚本`docker-entrypoint.sh`
Expand All @@ -132,8 +130,8 @@ if [ "$(id -u)" -eq '0' ]
then
USER_ID=${LOCAL_USER_ID:-9001}
usermod -u ${USER_ID} user > /dev/null 2>&1
usermod -a -G root user > /dev/null 2>&1
usermod -u ${USER_ID} -g ${USER_ID} user > /dev/null 2>&1
chown -R `id -u user`:`id -u user` /app > /dev/null 2>&1
export HOME=/home/user
exec gosu user "$0" "$@"
Expand All @@ -142,13 +140,18 @@ fi
exec "$@"
```

利用本地用户`ID`替换容器用户`user``ID`切换到`user`用户后再执行程序
利用本地用户`ID`替换容器用户`user`,使用`gosu`切换到`user`后再执行程序

```
# 注意传入本地用户ID到容器用户user
$ docker run -it --rm -e LOCAL_USER_ID=`id -u ${USER}` -v ${HOME}/storage:/home/user/storage gosu_test bash
user@3071f9df8234:/project$ id
uid=1000(user) gid=1000(user) groups=1000(user),0(root)
user@141e64f7222a:/app$ id
uid=1000(user) gid=1000(user) groups=1000(user)
user@141e64f7222a:/app$ ls -al
total 16
drwxr-xr-x 1 user user 4096 10月 6 20:38 .
drwxr-xr-x 1 root root 4096 10月 6 20:42 ..
-rwxrwxr-x 1 user user 275 10月 6 20:38 docker-entrypoint.sh
```

这样保证本地用户`ID`和容器用户`ID`一致,能够解决文件权限问题

0 comments on commit 5d33730

Please sign in to comment.