如何从Docker容器中加载照片?

vu8f3i0k  于 2023-01-01  发布在  Docker
关注(0)|答案(1)|浏览(177)

我有一个在Docker容器中使用React前端的项目。从这个UI中,我将图片(jpg、png文件)上传到位于单独Docker容器中的Node.js后端。从那里,图片被成功保存到共享卷,即React客户端的"public"文件夹。但是,我无法在UI中看到新上传的图片(使用简单的html标记:<img src="/racoon.jpg" />)。
唯一的方法,我可以看到的图片从用户界面是通过重建整个项目(docker compose build)。我认为这是因为Docker图像是不可变的。所以一旦新文件被添加,他们不会立即可见。但我需要一个解决方案,将主机的图片在实时。
我不确定我是否需要Docker。也许我可以从Docker启动一个节点服务器。我对Docker很陌生,有什么帮助吗?
我的docker-compose.yml,为了简洁起见省略了一些东西:

x-services-volume: &services-volume
  type: bind
  source: ./client/public
  target: /client/public

services:
  server:
    build: ./server
    container_name: node_server_container
    depends_on:
      - mysql-db
      - redis-cache
    environment:
      <<: *common-variables
      MYSQL_HOST_IP: mysql-db
    ports:
      - 8000:8000
    volumes: 
      - *services-volume
      - ./server:/app
    links:
      - mysql-db
      - redis-cache
    command: npm start

  client:
    build: ./client
    container_name: client_container
    environment:
      <<: *common-variables
      NODE_PATH: src
    ports:
      - 3000:3000
    volumes: 
      - *services-volume
      - ./client/src:/app/src
    links:
      - server
    command: npm start
2wnc66cl

2wnc66cl1#

Node.js/Express允许一个公共目录来提供静态文件(https://expressjs.com/en/starter/static-files.html)。我发现这在Docker容器中也是有效的。我为此设置了一个名为“files”的文件夹。

在我的index.js中

app.use(express.static('files'));

我不得不改变我的docker-compose.yml,不再使用共享卷,而是将“files”卷添加到我的服务器容器中。

server:
    build: ./server
    container_name: node_server_container
    depends_on:
      - mysql-db
      - redis-cache
    environment:
      <<: *common-variables
      MYSQL_HOST_IP: mysql-db
    ports:
      - 8000:8000
    volumes: 
      - ./server/files:/server/files/
      - ./server:/app
    links:
      - mysql-db
      - redis-cache
    command: npm start

  client:
    build: ./client
    container_name: client_container
    environment:
      <<: *common-variables
      NODE_PATH: src
    ports:
      - 3000:3000
    volumes: 
      - ./client/src:/app/src
    links:
      - server
    command: npm start

然后,我简单地修改了服务器端代码,将照片保存到files目录:

this.fileRouter.post('/upload', this.authPolicy, (req, res) => {

    if (!req.files || Object.keys(req.files.image).length === 0) {
        return res.status(400).send('No files were uploaded.');
    }

    try {

        let file = req.files.image;
        let target_path = `/server/files/${file.name}`;
        fs.writeFile(target_path, file.data, function (err) {
            if (err) console.error(err.stack);
            else {
                console.log('File uploaded to ' + target_path);
            }
        });

        res.send('File(s) uploaded!');

    } catch (err) {
        console.log(err);
        return res.status(422).send('Cannot process the file');
    }
});

然后我看到这样的照片:第一个月

相关问题