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, как если бы вы не делали этого на своем компьютере.Я добавил пользователя 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
, поэтому нет необходимости использовать оба.
Чтобы построить контейнер с теми же разрешениями вашей файловой системы для вашего пользователя, я добавил args
к деВ разделе сборки dockerfile я использую значения ОС для $UID
и $GID
, но если они не заданы, по умолчанию будет 1000
.
. Вы можете увидеть, какие из них в вашей ОС Linux с id -u
для $UID
и id -g
для $GID
.
Shell Script
Сделайте его исполняемым в вашем репо и передайте изменения так, чтобы выне нужно делать это каждый раз, когда вы создаете образ докера.
chmod 700 ./compose/start
Я не использую + x, потому что это плохая практика с точки зрения безопасности, если вы позволите всемвыполнить скрипт.
Сводка
Любых созданных файлов нетw внутри контейнера будет иметь uid
и gid
из 1000
, поэтому конфликт разрешений не должен возникать.