【问题标题】:How to modify volume files with host user inside container when using docker-compose使用 docker-compose 时如何在容器内使用主机用户修改卷文件
【发布时间】:2017-10-09 12:35:35
【问题描述】:

我有一个由 docker-compose 管理的 docker 容器,它在启动时将运行构建脚本以将一堆文件添加到映射到主机文件夹的卷上,因为容器始终以 root 身份运行,它不断创建文件root 在父文件夹中,如何设置 docker-compose 以便创建的文件将由与在主机文件系统上运行 docker-compose up 的用户相同的用户?

码头工人撰写文件

version: "2"
services:

  # Data API and authentication/authorization
  api:
    build:
      context: ../api/
      dockerfile: Dockerfile.dev
    hostname: api
    depends_on:
      - db
      - redis
    environment:
      - CORS_ORIGIN=http://localhost:3000,http://localhost:3001
      - DATABASE_URL=postgres://postgres@db:5432/dev
      - DATABASE_DEBUG=false
      - REDIS_URL=redis://redis:6379/0
      - SESSION_SECRET=wZjwhFtzQsd7r87W6AZw45Sm
      - FACEBOOK_ID=1821424564802638
      - FACEBOOK_SECRET=2339bdf25f236a42fc3a18280bf455e8
      - GOOGLE_ID=xxxxx.apps.googleusercontent.com
      - GOOGLE_SECRET=xxxxx
      - TWITTER_KEY=xxxxx
      - TWITTER_SECRET=xxxxx
    ports:
      - "8080:8080"
      - "127.0.0.1:9229:9229" # V8 inspector for tools/run.js
      - "127.0.0.1:9230:9230" # V8 inspector for src/server.js
    volumes:
      - yarn:/home/node/.cache/yarn
      - ../api/:/usr/src/app
    command: node tools/run.js # or, `node --inspect=0.0.0.0:9229 tools/run.js`

  # SQL and document data store
  db:
    image: postgres:9.6.5-alpine
    read_only: true
    tmpfs:
      - /tmp
      - /var/run/postgresql
    volumes:
      - db:/var/lib/postgresql/data
      - ./postgres-initdb.sh:/docker-entrypoint-initdb.d/initdb.sh
    # ports:
    #   - "127.0.0.1:5432:5432" # you can override it via docker-compose.override.yml

  # Distributed in-memory cache
  redis:
    image: redis:4.0.2-alpine
    read_only: true
    volumes:
      - redis:/data

volumes:
  db:
  redis:
  yarn:

api目录上的dockerfile.dev

FROM node:8.6.0-alpine

# Set a working directory
WORKDIR /usr/src/app

# If you have native dependencies, you'll need extra tools
RUN apk add --no-cache make g++ python2 libsodium-dev && \
  npm install -g node-gyp && \
  mkdir -p /home/node/.cache/yarn && \
  chown -R node:node /home/node/.cache/yarn && \
  chmod 777 /home/node/.cache/yarn

VOLUME /home/node/.cache/yarn

【问题讨论】:

    标签: docker


    【解决方案1】:

    没有直接的方法可以做到这一点,但您可以在 具有与主机用户相同的用户和组 ID 的容器。你可以这样做 在docker-compose build 期间使用构建参数。

    在码头文件中

    ARG UID
    ARG GID
    
    RUN groupadd -g $GID %group_name% && useradd -u $UID -g $GID --create-home -s /bin/bash %user_name%
    
    USER %user_name%
    

    在 docker-compose.yml 中

    version: "2"
    services:
    
      api:
        build:
          context: ../api/
          dockerfile: Dockerfile.dev
          args:
            UID: %your uid%
            GID: %you gid%
    

    更新 1(自动化)

    为了让多个用户更轻松地完成此过程,您可以将其自动化 位。

    在 docker-compose.yml 你可以像这样使用variable substitution

    version: "2"
    services:
    
      api:
        build:
          context: ../api/
          dockerfile: Dockerfile.dev
            args:
              UID: ${UID_VAR}
              GID: ${GID_VAR}
    

    您可以编写脚本,该脚本在 repo 中生成 .env 文件 特定用户(假设它的名字是 init.sh):

    echo "UID_VAR=`id -u $USER`" > .env && echo "GID_VAR=`id -g $USER`" >> .env
    

    所以你的每个用户都会做这样的事情:

    git clone repo
    cd repo
    ./init.sh # generates .env
    docker-compose build # earch user is have to build container because of GID and UID
    docker-compose up
    

    【讨论】:

    • 我将有很多用户共享这个存储库,这是否意味着他们每个人都必须这样做?
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多