我可以使用 docker 容器来保存静态文件以便其他 docker 容器可以访问它吗?

Can I use a docker container to keep static files so other docker containers can acces to it?

我正在构建两个微服务并将它们对接。我有一个文件夹,其中包含两个服务 (ServiceA & B) 中都需要的脚本 (PackageA)。我的文件夹结构如下:

Root
|
|--Docker
   |--ProjectA
      |-docker-compose.yml (builds ServiceA & ServiceB)
|--Services
   |--PackageA
      |-src
      |-index.js
      |-package.json

   |--ServiceA
      |-src
      |-index.js
      |-Dockerfile
      |-package.json

   |--ServiceB
      |-src
      |-index.js
      |-Dockerfile
      |-package.json

我的docker-compose.yml:

version: '3'

networks:
  mynetwork:

services:
  servicea:
    build: ./../../Services/ServiceA
    container_name: servicea
    ports:
      - ...
    networks:
      - mynetwork
  serviceb:
    build: ./../../Services/ServiceB
    ports: serviceb
      - ...
    networks:
      - mynetwork

在这两个服务中 Dockrfile 看起来像这样:

FROM node:16
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
COPY . ./
EXPOSE ...
CMD [ "node", "index.js" ]

所以我的问题是:我能否也对接 PackageA 并创建一个包含其内容的卷,然后在 ServiceA & B 中使用该卷?我如何在容器之间共享卷?

我认为采用这种架构风格并不是一件好事。如果它们以这种方式耦合,它们就不是微服务。你最好发布你的共享库或者甚至做一些复制和粘贴来复制代码。

但是,从技术上讲,这是可能的。您可以按照以下方式做一些事情:

用于共享服务的 Dockerfile 在目录 /shared.

中创建了一些虚拟内容
FROM busybox

WORKDIR /shared
RUN echo "shared content" > /shared/data.txt

然后启动了2个服务。两者都安装共享卷。共享服务首先安装卷,因为 app-a 有一个 depends_oncondition

name: example

services:
  shared:
    build: ./
    volumes: [ shared:/shared ]
  app-a:
    image: busybox
    command: cat /shared/data.txt
    volumes: [ shared:/shared ]
    depends_on:
      shared:
        condition: service_completed_successfully

volumes:
  shared:
$ docker compose up
[+] Running 4/4
 ⠿ Network example_default     Created                                                                                                                                                                     0.6s
 ⠿ Volume "example_shared"     Created                                                                                                                                                                     0.0s
 ⠿ Container example-shared-1  Created                                                                                                                                                                     0.1s
 ⠿ Container example-app-a-1   Created                                                                                                                                                                     0.1s
Attaching to example-app-a-1, example-shared-1
example-shared-1 exited with code 0
example-app-a-1   | shared content
example-app-a-1 exited with code 0

挂载一个空的命名卷时,首先将容器文件系统的内容复制到该卷中,然后再进行挂载。

这样,app-a、看到共享内容。

有时您可能还希望让共享服务在启动时手动填充卷。因为我在这里所做的是针对 docker 的。例如,它不会在 Kubernetes 中工作。当共享服务启动时,您必须将共享内容复制到卷中。

shared:
  image: busybox
  command: sh -c 'echo "shared content" > /shared/data.txt'
  volumes: [ shared:/shared ]