在我的宠物项目中,我设置了docker-compose进行开发。问题是我已经在dockerimage中创建了django迁移并创建了commit。签出到主分支后,我看到一个错误。这些文件无法跟踪,因此我无法将sub分支合并到main中。
git checkout master
warning: unable to unlink 'apps/app_name/migrations/0001_initial.py': Permission denied
warning: unable to unlink 'apps/app_name/migrations/0002_auto_20190127_1815.py': Permission denied
warning: unable to unlink 'apps/app_name/migrations/__init__.py': Permission denied
Switched to branch 'master'
我也尝试过使用sudo。所有新文件将在主分支中显示为未跟踪,但不会添加新提交(基于git log
)
docker-compose.yml
version: '3'
services:
db:
image: postgres
web:
build:
dockerfile: ./compose/Dockerfile.dev
context: .
command: /start
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
links:
- db:db
Dockerfile
FROM python:3.6.8-alpine
ENV PYTHONUNBUFFERED 1
RUN apk update \
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev \
&& apk add postgresql-dev \
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
# CFFI dependencies
&& apk add libffi-dev py-cffi \
# Translations dependencies
&& apk add gettext \
# https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell
&& apk add postgresql-client
RUN mkdir /code
WORKDIR /code
COPY /requirements /code/requirements/
RUN pip install -r requirements/dev.txt
COPY . /code/
COPY ./compose/start /start
RUN sed -i 's/\r//' /start
RUN chmod +x /start
start.sh
#!/bin/sh
set -o errexit
set -o pipefail
set -o nounset
python manage.py migrate
python manage.py runserver_plus 0.0.0.0:8000
答案 0 :(得分:1)
Dockerfile
FROM python:3.6.8-alpine
ENV PYTHONUNBUFFERED 1
ARG CONTAINER_USER="python"
ARG CONTAINER_UID="1000"
ARG CONTAINER_GID="1000"
ARG WORKSPACE=/home/"${CONTAINER_USER}"/code
RUN apk update \
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev \
&& apk add postgresql-dev \
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
# CFFI dependencies
&& apk add libffi-dev py-cffi \
# Translations dependencies
&& apk add gettext \
# https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell
&& apk add postgresql-client && \
addgroup -g "${CONTAINER_GID}" -S "${CONTAINER_USER}" && \
adduser -s /bin/ash -u "${CONTAINER_UID}" -G "${CONTAINER_USER}" -h /home/"${CONTAINER_USER}" -D "${CONTAINER_USER}"
USER "${CONTAINER_USER}"
WORKDIR "${WORKSPACE}"
COPY ./requirements/dev.txt "${WORKSPACE}"/requirements.txt
RUN pip install -r requirements.txt
以root用户身份在docker容器中运行任何方法都是不明智的做法,就像您不会在计算机中执行该操作一样。我添加了一个用户python
,该用户将与您的计算机的uid
相同,并假定您的操作系统用户与uid 1000
一样,在Linux计算机中是正常的。如果您使用的是其他操作系统,则可能无法正常工作,因此您需要为特定的操作系统找到解决方案。
docker-compose.yml
version: '3'
services:
db:
image: postgres
web:
build:
dockerfile: ./compose/Dockerfile.dev
context: .
args:
CONTAINER_UID: ${UID:-1000}
CONTAINER_GID: ${GID:-1000}
command: ./compose/start
volumes:
- .:/home/python/code
ports:
- "8000:8000"
depends_on:
- db
links
已过时,已被depends_on
取代,因此不必同时使用两者。
为了为您的用户使用与您的文件系统相同的权限来构建容器,我在dockerfile build部分中添加了args
,并使用了$UID
和$GID
的OS值,但如果未设置,则默认为1000
。
您可以看到Linux操作系统中的什么,其中id -u
的{{1}}和$UID
的{{1}}。
Shell脚本
使它在您的仓库中可执行,并提交更改,这样您就不必在每次构建docker映像时都这样做。
id -g
我不使用+ x,因为一旦允许所有人执行脚本,这就安全性而言就是个坏习惯。
摘要
现在在容器内部创建的任何文件都将具有$GID
的{{1}}和chmod 700 ./compose/start
,因此权限不会再发生冲突。