docker-compose - 无法在使用 BUILD 创建的文件夹中使用绑定安装

docker-compose - cannot use bind mount in folder created when using BUILD

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

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

这是我的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"]

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

PS:我知道我正在使用的这张图片(ubuntu 可信赖)是旧的,但我的旧应用程序只有 运行 这个版本。

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

ADD myapp /workspace/

我想你是想把它映射到你的 docker 容器中,所以在 volumes

volumes:
      - ./myapp:/workspace

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

我最终将源代码目录添加到容器中以解决此问题。 @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来重启容器。新版本已经存在了。