【问题标题】:Is it possible to have a mount and volume in the same container using docker-compose?是否可以使用 docker-compose 在同一个容器中安装和卷?
【发布时间】:2021-12-27 00:26:40
【问题描述】:

是否可以在同一个容器中同时拥有挂载和卷?我一直在尝试使用不同的路径设置挂载和卷,但我无法获得正确的权限集。

我的 docker 文件:

FROM node:16-alpine
RUN apk add dumb-init

RUN addgroup appgroup && adduser -S appuser -G appgroup

RUN mkdir -p /app/logs

WORKDIR /app/


COPY package*.json ./
RUN npm install


COPY . /app
RUN chown -R appuser:appgroup /app/

USER appuser

docker-compose.yml

version: "3.8"
services:
  my-service:
    user: "1000"
    container_name: demou 
    build:
      context: . 
    image: "my-service" 

    working_dir: /app/ 

    ports:
      - 80:80 
    environment:
      - NODE_VERSION=16 
    volumes:
       - ~/logs:/app/logs/:rw
       - other:/app/other/:rw
    command: sh -c "dumb-init node src/server.js"

    networks:
      - Snet
volumes:
  other:
    name: "other"
networks:
  Snet:
    name: "Snetwork"

如果我将 user: "1000" 保留在 docker-compose 文件中,则挂载工作并且我可以看到文件,但卷失败,并且在尝试写入卷声明中指定的 app/other 时,我的权限被拒绝。 删除 user: "1000" 会解析卷权限,但会导致挂载失败,权限被拒绝。

使用 docker exec,我可以通过user: "1000" 看到以下权限

drwxr-xr-x    1 appuser  appgroup      4096 Nov 15 15:08 .
drwxr-xr-x    1 root     root          4096 Nov 15 15:08 ..
drwxrwxr-x    2 node     node          4096 Nov 15 15:08 logs
drwxr-xr-x    1 appuser  appgroup      4096 Nov 15 15:08 node_modules
drwxr-xr-x    2 root     root          4096 Nov 15 15:08 other
-rw-rw-r--    1 appuser  appgroup     31394 Nov 15 11:55 package-lock.json
-rw-rw-r--    1 appuser  appgroup       274 Nov 15 11:55 package.json
drwxrwxr-x    1 appuser  appgroup      4096 Nov 13 13:56 src

另外,为什么日志目录归节点:节点所有?我还没有设置任何节点用户或组。

我的操作系统/docker 主机详细信息:

分销商 ID:Ubuntu 说明:Ubuntu 20.04.3 LTS 发布时间:20.04 代号:焦点

谢谢

【问题讨论】:

    标签: docker docker-compose docker-volume


    【解决方案1】:

    ~/logs:/app/logs/:rw

    必须将目录~/logs rw 授予1000:1000 (appuser:appgroup),因为这是主机上的现有目录。

    other:/app/other/:rw

    命名卷由 docker 在 root 拥有的主机上创建(无根模式除外)。使用VOLUME保留Dockerfile中设置的权限:

    FROM node:16-alpine
    RUN apk add dumb-init
    RUN addgroup appgroup && adduser -S appuser -G appgroup
    RUN mkdir -p /app/logs && mkdir /app/other
    WORKDIR /app/
    COPY package*.json ./
    RUN npm install
    COPY . /app
    RUN chown -R appuser:appgroup /app/
    USER appuser
    VOLUME /app/other
    

    why is logs directory owned by node:node?

    此用户:组是在基础映像节点:16-alpine 中创建的。

    解决类似问题的替代method,如果它适合您的需要。

    【讨论】:

    • 对于延迟回复,我深表歉意。我有一件私人事情要处理。如果我将用户更改为用户:“0”,我可以同时使用挂载和卷。在 root 中使用“0”会被认为是一种不好的做法吗?
    • 在 chmod 755 记录后,从容器写入文件仍然会引发权限被拒绝
    • 打错了,让我重新输入。 ~/logs 这是用户主目录中的一个目录,通常是运行容器的同一用户。如果你可以 chmod 666 这个目录,你可以绑定挂载而不需要以 root 身份运行。您还可以为该目录创建一个命名卷,就像您为“其他”所做的那样。当您想检查日志卷时,只需运行一个简单的 busybox 并像 docker run -it -v log:/log busybox ash 一样挂载它。如果您可以以非 root 身份运行 - 那很好。如果你不能,这不是一个坏习惯(否则为什么它首先存在?)但你需要注意一些事情。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2021-12-15
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多