无法修改在Docker容器中创建的文件

时间:2019-12-10 11:22:19

标签: django docker docker-compose dockerfile

我有一个运行着django应用程序的容器,有时我进入该容器的外壳并运行./manage makemigrations为我的应用程序创建迁移。
文件创建成功并在主机和容器之间同步。
但是,在我的主机上,我无法修改在容器中创建的任何文件。

这是我的Dockerfile

FROM python:3.8-alpine3.10
LABEL maintainer="Marek Czaplicki <marek.czaplicki>"

WORKDIR /app

COPY ./requirements.txt ./requirements.txt

RUN set -ex; \
        apk update; \
        apk upgrade; \
        apk add libpq libc-dev gcc g++ libffi-dev linux-headers python3-dev musl-dev pcre-dev postgresql-dev postgresql-client swig tzdata; \
        apk add --virtual .build-deps build-base linux-headers; \
        apk del .build-deps; \
        pip install pip -U; \
        pip --no-cache-dir install -r requirements.txt; \
        rm -rf /var/cache/apk/*; \
        adduser -h /app -D -u 1000 -H uwsgi_user


ENV PYTHONUNBUFFERED=TRUE

COPY . .
ENTRYPOINT ["sh", "./entrypoint.sh"]
CMD ["sh", "./run_backend.sh"]

run_backend.sh


./manage.py collectstatic --noinput
./manage.py migrate && exec uwsgi --strict uwsgi.ini

我该怎么做才能在主机中修改这些文件?我不想每次创建文件时都chmod
由于某种原因,有一个项目可以在主机中编辑容器中创建的文件,但是我发现这两者之间没有任何区别。

3 个答案:

答案 0 :(得分:0)

通常在Docker容器内创建的文件归容器的根用户所有。

您可以在容器中尝试使用此方法

SodukuSolver

您可以将其作为chown 1000:1000 file-you-want-to-edit-outside

添加到Dockerfile的最后一层

编辑:

如果您使用的是RUN,则可以将docker-compose添加到您的容器中:

user

service: container: user: ${CURRENT_HOST_USER} 等于CURRENT_HOST_USER

答案 1 :(得分:0)

默认情况下,Docker容器以root身份运行。这有两个问题:

  1. 如您所见,在开发中,文件归root拥有,而这通常不是您想要的。
  2. 在生产中,这是一种安全风险(https://pythonspeed.com/articles/root-capabilities-docker-security/)。

出于开发目的,docker run --user $(id -u) yourimage或其他答案中给出的Compose示例会将用户与您的主机用户匹配。

要进行生产,您需要在图像内创建一个用户;有关详情,请参见上面链接的页面。

答案 2 :(得分:0)

解决方案是添加

USER uwsgi_user

Dockerfile,然后简单运行docker exec -it container-name sh