如果在docker镜像中创建了文件,如何签出分支?

问题描述 投票:0回答:1

在我的宠物项目中,我设置了docker-compose进行开发。问题是我在dockerimage中创建了django迁移并创建了commit。结帐到主分支后,我看到一个错误。这些文件无法跟踪,我无法将子分支合并到主文件中。

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

泊坞窗,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.是

#!/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
django git docker
1个回答
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机器中是正常的。如果您使用的是其他操作系统,则可能无法正常运行,您需要找到适合您特定操作系统的解决方案。

泊坞窗,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添加到de dockerfile构建部分,并使用$UID$GID的OS值,但如果未设置它们将默认为1000

你可以看一下你的Linux操作系统中id -u$UIDid -g$GID

Shell脚本

使其在您的仓库中可执行并提交更改,这样您每次构建docker镜像时都不需要这样做。

chmod 700 ./compose/start

我不使用+ x,因为一旦你允许每个人都执行脚本,这在安全性方面是不好的做法。

摘要

现在在容器内创建的任何文件都将具有uidgid1000,因此权限不会发生更多冲突。

© www.soinside.com 2019 - 2024. All rights reserved.