【问题标题】:docker-compose - cannot use bind mount in folder created when using BUILDdocker-compose - 无法在使用 BUILD 时创建的文件夹中使用绑定挂载
【发布时间】:2021-12-30 18:19:37
【问题描述】:

我有一个 docker-compose 文件,它使用 Dockerfile 来构建图像。在这张图片 (Dockerfile) 中,我创建了文件夹 /workspace,我想绑定 mount 以在本地文件系统中持久保存。

在 docker-compose up 之后,如果我绑定挂载,则该文件夹为空,但如果我不挂载该文件夹,一切正常(并且该文件夹存在我添加的所有文件)。

这是我的 docker-compose.yml:

version: "3.9"
services:
  web:
    build: .
    command: uwsgi --ini /workspace/confs/uwsgi.ini --logger file:/workspace/logs/uswgi.log --processes 1 --workers 1 --plugins-dir=/usr/lib/uwsgi/plugins/ --plugin=python
    environment:
      - DB_HOST=db
      - DB_NAME=***
      - DB_USER=***
      - DB_PASS=***
    depends_on:
      - db
      - redis
      - memcached
    volumes:
      - ./workspace:/workspace
    networks:
      - asyncmail
      - traefik
# db, redis and memcached are ommited here
# aditional labels for traefik is also ommited

这是我的 Dockerfile:

FROM ubuntu:trusty
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
SHELL ["/bin/bash", "-c"]
RUN mkdir /workspace
RUN apt-get update -y && apt-get upgrade -y 
RUN apt-get install -y redis-server python3-pip git-core postgresql-client
RUN apt-get install -y libpq-dev python3-dev libffi-dev libtiff5-dev zlib1g-dev libjpeg8-dev libyaml-dev libpython3-dev openssh-client uwsgi-plugin-python3 libpcre3 libpcre3-dev uwsgi-plugin-python

ADD myapp /workspace/
WORKDIR /workspace/src/
RUN /bin/bash -c "pip3 install cffi \
    && pip3 install -r /workspace/src/requirements.txt \
    && ./manage.py collectstatic --noinput"

RUN ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime

# CMD ["uwsgi", "--ini", "/workspace/confs/uwsgi.ini", "--logger", "file:/workspace/logs/uswgi.log"]
  • 我知道有些项目可以优化,但是当我执行docker-compose up -d 时,会创建文件夹 ./workspace,其中只有一个名为 src 的文件夹。在容器内,/workspace 也只有这个空文件夹;
  • 如果我删除 docker-compose 中的 volumes 行,在容器内,文件夹 /workspace 包含我的应用程序的所有源代码。

我做错了什么无法绑定挂载工作区文件夹?

PS:我知道我正在使用的这张图片(ubuntu trusty)是旧的,但我的旧应用只能在这个版本上运行。

【问题讨论】:

  • 如果您在容器目录上绑定挂载主机目录,则主机目录中存在的任何内容总是隐藏映像中构建的内容。这意味着您通常不希望将目录绑定到包含实际应用程序的目录上;也许你想要一个单独的/workspace/data 目录。

标签: docker ubuntu docker-compose dockerfile


【解决方案1】:

我是否正确假设您想要显示在工作区中的文件实际上位于主机中名为“myapp”的文件夹中 (从这一行看来是这样)

ADD myapp /workspace/

我认为您打算将其映射到您的 docker 容器中,所以在卷下

volumes:
      - ./myapp:/workspace

卷映射以一种方式工作,即容器内的文件夹被主机上映射文件夹的内容替换,而不是相反...

【讨论】:

  • 1) 是的,myapp是有源代码的文件夹; 2)关于容器内的文件夹被映射文件夹的内容替换,我知道反过来也可以 - 第一次启动postgresql容器时,他将容器内的数据文件夹复制到主机绑定文件夹中的文件系统。我错过了什么吗?
【解决方案2】:

我最终将源代码目录添加到容器中以解决此问题。 @NiRR 的回答很有帮助。

最终的 Dockerfile 更改为不包含镜像中的源代码:

FROM ubuntu:trusty
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ARG DEBIAN_FRONTEND=noninteractive
SHELL ["/bin/bash", "-c"]
RUN apt-get update -y && apt-get upgrade -y 
RUN apt-get install -y python3-pip git-core postgresql-client
RUN apt-get install -y libpq-dev python3-dev libffi-dev libtiff5-dev zlib1g-dev libjpeg8-dev libyaml-dev libpython3-dev openssh-client uwsgi-plugin-python3 libpcre3 libpcre3-dev

WORKDIR /workspace/src
COPY myapp/src/requirements.txt .
RUN /bin/bash -c "pip3 install cffi \
    && pip3 install -r requirements.txt"

# To set timezone
RUN ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime

我将 docker-compose 更改为以下最终版本:

version: "3.9"
services:
  web:
    build: .
    command: ./start.sh
    environment:
      - DB_HOST=db
      - DB_NAME=***
      - DB_USER=***
      - DB_PASS=***
    volumes:
      - ./myapp:/workspace
  • 现在在容器启动中,myapp 中的所有源代码都被复制到容器内;
  • 一切都在 GIT 控制之下
  • 如果代码发生变化,我们可以做一个push/pull和docker-compose up -d来重启容器。新版本已经存在。

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多