文件未在docker-compose中从容器同步到主机

时间:2019-06-29 15:59:55

标签: python docker flask docker-compose

因此,我正在使用docker-compose与nginx一起运行一个简单的flask应用程序。

这里是docker-compose.yml

version: '3.2'
services:
    nginx:
        image: nginx:latest
        container_name: nginx
        ports:
            - 80:80
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            - flask
        networks:
            - my-network
    flask:
        build:
          context: .
          dockerfile: Dockerfile
        image: webapp-flask
        container_name: flask
        volumes:
            - type: bind
              source: ./
              target: /app
            - type: bind
              source: ./users.json
              target: /app/users.json
        networks:
            my-network:
                aliases:
                    - flask-app
        ports:
            - 8080:5000
networks:
    my-network:

volumes:部分中,我试图将当前主机目录绑定到主机上的/app目录,以及users.json文件(我想同步)

这是烧瓶的Dockerfile

FROM python:3
RUN pip install flask flask-restful
EXPOSE 5000
CMD python app/app.py

app.py会根据请求对users.json进行更改。一切正常,除了users.json文件在容器上更新(例如,通过请求),该更新未反映在我的主机上。

仅供参考,我正在使用Windows和Docker Toolbox。 在主机和容器之间绑定users.json时,我需要做些特别的事情吗?

编辑:此问题是由于我自己的愚蠢造成的,首先是在Dockerfile中使用python:3图像,然后在docker-compose.yml中使用图像我再次使用了webapp-flask的新图像。我不知道为什么这首先不会造成冲突,但是显然,真正的问题在于,每当我运行docker-compose up时,它都会使用旧文件的缓存版本,而从不重建容器。当我对app.py进行更改时,我发现了这一点,并且在运行整个过程时它们没有生效。因此,我要做的就是删除较旧的容器,并删除在docker-compose.yml中指定图像的行,并且行得通。

1 个答案:

答案 0 :(得分:1)

Akhand Mishra

几个问题:

  • users.json文件在主机系统上的什么位置?它在您的应用程序目录之外吗? (如果没有,那么)
  • 是否有任何原因不能简化卷配置以将整个应用程序目录绑定到容器?看来您已经在执行此操作,而且还绑定了users.json文件作为其他目标。

我的建议是可能在主机上创建一个附加的/data/目录,该目录可用于容纳users.json文件。因此,在您的docker-compose.yml中是这样的:

flask:
    build:
        context: .
        dockerfile: Dockerfile
    image: webapp-flask
    container_name: flask
    volumes:
        - .:/app/
        - .:/data/
    networks:
        my-network:
            aliases:
                - flask-app
    ports:
        - 8080:5000

我不确定是否可以通过compose将卷挂载到显式的单个文件,并怀疑它可能需要是在卷yaml键中调出的整个目录。