使用 docker-compose 时如何在容器内使用主机用户修改卷文件
Posted
技术标签:
【中文标题】使用 docker-compose 时如何在容器内使用主机用户修改卷文件【英文标题】:How to modify volume files with host user inside container when using 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
【问题讨论】:
【参考方案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
【讨论】:
我将有很多用户共享这个存储库,这是否意味着他们每个人都必须这样做?以上是关于使用 docker-compose 时如何在容器内使用主机用户修改卷文件的主要内容,如果未能解决你的问题,请参考以下文章
docker-compose内mysql 挂载数据库目录,启动时mysql容器自动退出
docker-compose创建的网段与内网冲突时的解决方法
尝试在运行 docker-toolbox 的 Windows 上使用 docker-compose 在 docker 容器内运行 webpack-dev-server 时出现“来自服务器的空回复”