【问题标题】:Docker shouldn't write new files to original directoriesDocker 不应该将新文件写入原始目录
【发布时间】:2018-12-28 01:43:27
【问题描述】:

我有一个项目,目录结构如下:

docker-compose.yml
project1/
--Dockerfile
--docker-compose-entry.sh
project2/
--Dockerfile
--docker-compose-entry.sh
project3/
--Dockerfile
--docker-compose-entry.sh

我的docker-compose-entry.sh 文件在容器启动时创建并写入一些文件。但这又做了一件奇怪的事情。当他们在他们的容器中写入文件时,他们也会将文件写入我本地的原始目录。

我希望文件在启动时写入容器中并留在容器中而不触及我的实际目录。生成的文件应该随着容器被破坏而被破坏。

有没有人建议如何做到这一点?任何想法都将受到高度赞赏。

更新以下是我在 cmets 中要求的文件内容:

# docker-compose.yml

version: '2'

services:
  project1:
    restart: always
    build: ./project1
    image: project1
    command: gunicorn project1.wsgi -b 0.0.0.0:8000
    volumes:
      - ./project1:/project1
      - ./common:/project1/common
    expose:
      - "8000"
    depends_on:
      - db
  project2:
    restart: always
    build: ./project2
    image: project2
    command: gunicorn project2.wsgi -b 0.0.0.0:8000
    volumes:
      - ./project2:/project2
      - ./common:/project2/common
    expose:
      - "8000"
    depends_on:
      - db
  project3:
    restart: always
    build: ./project3
    image: project3
    command: gunicorn project3.wsgi -b 0.0.0.0:8000
    volumes:
      - ./project3:/project3
      - ./common:/project3/common
    expose:
      - "8000"
    depends_on:
      - db
  db:
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    volumes:
      - data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: sacrina
volumes:
  data:

这是我在 project1 中的 Dockerfile 示例。

#Dockerfile

FROM wildfish/django:node-latest

RUN mkdir /project1
WORKDIR /project1
ADD . /project1

ADD requirements.txt /project1/
ADD ./common/.bowerrc /project1/
ADD ./common/bower.json /project1/
ADD ./common/package.json /project1/
ADD ./common/gulpfile.js /project1/
ADD ./config/ /project1/

RUN pip install -r /project1/requirements.txt
RUN npm install --global bower gulp-cli

COPY ./docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entry-point.sh

ENTRYPOINT ["docker-entry-point.sh"]

这是我的 docker-entry-point.sh 的示例

# docker-entry-point.sh

#!/bin/sh

npm install
bower install
gulp

python manage.py collectstatic --no-input
gunicorn project1.wsgi -b 0.0.0.0:8000

【问题讨论】:

  • 您想要的行为是 docker 的工作方式,除非您正在写入从主机挂载的目录。
  • 扩展@Paulpro,如果你包含你的shell脚本的内容,我们可能会告诉你为什么你得到本地副本(安装?)
  • ...以及(尤其是)docker-compose.yml 文件的内容。
  • @DavidMaze 我已经用我的文件内容更新了我的问题。
  • @sshussain270 删除卷挂载,写入将发生在容器内而不是您的主机上。

标签: linux bash docker docker-compose


【解决方案1】:

您误用了volumes。你在做什么呢

首先,您将子文件夹中的所有内容复制到您 Dockerfile:ADD . /project1 中构建阶段的容器中。 完成此操作后,您已经拥有 /project1 以及容器中的所有内容,并且可以使用它。

但是,当您使用 docker-compose 启动容器时,您会使用

创建额外的 binding
volumes:
  - ./project2:/project2

所以你

1) 用主机文件夹覆盖容器中的内容

2) 允许容器修改宿主的文件夹,因为绑定是可写的(创建只读,你指定- ./project2:/project2:ro

您只需从docker-compose 中删除此卷声明即可享受。

顺便说一句,如果您的所有通信都在一个 docker-compose 中的容器之间运行,并且您未指定 network 模式(默认为 bridge),则您不需要像在中那样显式公开端口

expose:
  - "8000"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多