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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果在docker镜像中创建了文件,如何签出分支?相关的知识,希望对你有一定的参考价值。

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

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

以上是关于如果在docker镜像中创建了文件,如何签出分支?的主要内容,如果未能解决你的问题,请参考以下文章

新的未修改分支上的树冲突

在不签出的情况下将文件提交到不同的分支

使用 GIT 如何将不同提交中的文件签出到新分支中? [复制]

签出时添加到分支 dev 的文件显示在另一个分支中且未合并 Visual Studio [重复]

如何检索分支上元素的结帐评论?

如何在不知道 JGit 本地是不是存在的情况下签出远程分支?