Как оформить ветки, если в образе докера есть файлы? - PullRequest
0 голосов
/ 27 января 2019

В своем любимом проекте я настроил docker-compose для разработки.Проблема в том, что я создал миграцию django внутри dockerimage и создал коммит.После проверки в основной ветке я вижу ошибку.Эти файлы не отслеживаются, и я не могу объединить дочернюю ветку с основной.

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

1 Ответ

0 голосов
/ 27 января 2019

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, поэтому конфликт разрешений не должен возникать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...