我可以使用 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_on
和 condition
。
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 ]
我正在构建两个微服务并将它们对接。我有一个文件夹,其中包含两个服务 (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_on
和 condition
。
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 ]