如何检查分支是否在Docker映像中创建了文件?

时间:2019-01-27 19:08:35

标签: django git docker

在我的宠物项目中,我设置了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

1 个答案:

答案 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 ,因此权限不会再发生冲突。