我有来自 nginx 映像的带有 myuser 的 Dockerfile,我想在已安装的位置安装日志,我正在使用 docker-compose 来启动容器。我的要求是仅使用非 root 用户并且不使用 sudo。
RUN addgroup mygroup
RUN adduser myuser --disabled-password
USER myuser
Run Code Online (Sandbox Code Playgroud)
version: "2"
services:
nginx:
container_name: nginx
image: mynginx:v1
ports:
- "8888:80"
volumes:
- ./log/nginx:/var/log/nginx
Run Code Online (Sandbox Code Playgroud)
尽管目录已挂载,但主机上看不到 nginx 日志文件 access.log 和 error.log。
Docker 日志如下:
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2021/04/09 12:46:08 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
2021/04/09 12:46:08 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
Run Code Online (Sandbox Code Playgroud)
但是,如果我对以 root 用户身份运行的官方 nginx 映像执行相同操作,则一切正常。
version: "2"
services:
nginx:
container_name: nginx
image: nginx
ports:
- "8888:80"
volumes:
- ./log/nginx:/var/log/nginx
Run Code Online (Sandbox Code Playgroud)
尝试查看各种选项,但到目前为止还没有运气。
小智 13
最有可能的是主机上的 UID与容器内的myuserUID 不匹配。myuser
如果您想从容器内写入主机的目录,您必须首先myuser在主机上创建一个用户并通过以下方式检查其 UID
$ sudo su - myuser -c "id"
uid=1000(myuser) gid=100(users) Gruppen=100(users)
Run Code Online (Sandbox Code Playgroud)
在此示例中,UID=1000,GID=100。
现在您需要在主机上创建一个~/log/nginx所有者/组为的文件夹。myuser
$ sudo mkdir ~/log/nginx
$ sudo chown myuser ~/log/nginx
$ sudo chmod -R 0700 ~/log/nginx/
Run Code Online (Sandbox Code Playgroud)
之后,您可以创建一个 Dockerfile 和具有相同 UID/GID 的用户。
RUN useradd myuser -u 1000 -g 100 -m -s /bin/bash
USER myuser
Run Code Online (Sandbox Code Playgroud)
现在您应该能够使用指定的用户写入已安装的卷。您可以通过以下方式检查:
docker run -v $(pwd)/log/nginx:/var/log/nginx --rm -it mynginx:v1 /bin/bash
Run Code Online (Sandbox Code Playgroud)
如果你现在可以写信给/var/log/nginx
| 归档时间: |
|
| 查看次数: |
16844 次 |
| 最近记录: |