【问题标题】:Can't modify files created in docker container无法修改在 docker 容器中创建的文件
【发布时间】:2019-12-10 11:22:19
【问题描述】:

我有一个运行 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
出于某种原因,有一个项目在容器中创建的文件可以由主机编辑,但我找不到这两者之间的任何区别。

【问题讨论】:

  • 您需要提供更多信息,如果您不使用卷,您应该如何更改文件?码头工人cp?你到底想做什么?
  • 您通常根本不会尝试像这样在容器文件系统中进行更改。您应该能够在 Python 虚拟环境中从主机系统源代码树中运行类似的命令,可选择指向 Docker 托管的数据库。

标签: django docker docker-compose dockerfile


【解决方案1】:

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

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

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

对于生产,您需要在图像中创建一个用户;有关详细信息,请参阅上面链接的页面。

【讨论】:

    【解决方案2】:

    通常在 docker 容器中创建的文件归容器的 root 用户所有。

    你可以在你的容器里试试这个:

    chown 1000:1000 file-you-want-to-edit-outside
    

    您可以将其添加为 Dockerfile 的最后一层 RUN

    编辑:

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

    service:
      container:
        user: ${CURRENT_HOST_USER}
    

    并且让CURRENT_HOST_USER 等于$(id -u):$(id -g)

    【讨论】:

      【解决方案3】:

      解决方案是添加

      USER uwsgi_user
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 2021-05-21
        • 2020-05-23
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多