如果在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
的$UID
和id -g
的$GID
。
Shell脚本
使其在您的仓库中可执行并提交更改,这样您每次构建docker镜像时都不需要这样做。
chmod 700 ./compose/start
我不使用+ x,因为一旦你允许每个人都执行脚本,这在安全性方面是不好的做法。
摘要
现在在容器内创建的任何文件都将具有uid
的gid
和1000
,因此权限不会发生更多冲突。
以上是关于如果在docker镜像中创建了文件,如何签出分支?的主要内容,如果未能解决你的问题,请参考以下文章
使用 GIT 如何将不同提交中的文件签出到新分支中? [复制]