需要了解如何在docker-compose文件中使用单个服务中的多个映像。
考虑下面的docker-compose文件
version: '3.4'
services:
postgres:
image: timescale/timescaledb:latest-pg14
restart: always
environment:
- POSTGRES_USER=xxxx
- POSTGRES_PASSWORD=xxxx
logging:
options:
max-size: 10m
max-file: "3"
ports:
- '5432:5432'
volumes:
- ./postgres-data:/var/lib/postgresql/data
- ./sql/historydb.sql:/docker-entrypoint-initdb.d/historydb.sql
app:
image: xxxxxxxxxxxxxx:xx.xx.xx.xx
network_mode: host
volumes:
- ./sample:/var/sample
正如你从上面的例子中看到的,我们有两个服务(postgres和app)。
现在我们想要将这两个服务合并为一个(例如,mergedapp)。因此我们有如下的服务,
version: '3.4'
services:
mergedapp:
image: timescale/timescaledb:latest-pg14
image: xxxxxxxxxxxxxx:xx.xx.xx.xx
restart: always
network_mode: host
environment:
- POSTGRES_USER=xxxx
- POSTGRES_PASSWORD=xxxx
logging:
options:
max-size: 10m
max-file: "3"
ports:
- '5432:5432'
volumes:
- ./postgres-data:/var/lib/postgresql/data
- ./sql/historydb.sql:/docker-entrypoint-initdb.d/historydb.sql
- ./sample:/var/sample
我知道上面的docker-compose内容是无效的。因此,我需要一些docker-compose文件内容来满足我的要求。
请帮助。
尝试了以下操作,但没有成功,
version: '3.4'
services:
mergedapp:
image: timescale/timescaledb:latest-pg14
image: xxxxxxxxxxxxxx:xx.xx.xx.xx
restart: always
network_mode: host
environment:
- POSTGRES_USER=xxxx
- POSTGRES_PASSWORD=xxxx
logging:
options:
max-size: 10m
max-file: "3"
ports:
- '5432:5432'
volumes:
- ./postgres-data:/var/lib/postgresql/data
- ./sql/historydb.sql:/docker-entrypoint-initdb.d/historydb.sql
- ./sample:/var/sample
危险,但正好回答了你的问题:
创建一个新的Dockerfile,命名为my-merged-app-dockerfile.yml
,并在该Dockerfile中使用多层。
FROM timescale/timescaledb:latest-pg14
FROM xxxxxxxxxxxxxx:xx.xx.xx.xx
#Copy everything from the first layer (red alert!)
COPY --from=0 / /
然后使用dockerfile for your compose:
services:
mergedapp:
build:
context: THE_DIRECTORY_OF_THE_DOCKERFILE
dockerfile: my-merged-app-dockerfile.yml
restart: always
network_mode: host
但是你需要确切地知道你在做什么,因为我们把所有的东西从第一层复制到第二层。如果这就是你所说的"合并"的话。
如果你的两个基本映像的基础是相同类型的(例如ubuntu:22.04),并且你的两个映像没有重叠的库,因为不同的版本会互相终止,那么你的新映像可能在合并后存活下来。否则,可能会出现未定义的行为。
因此,我宁愿改变我的设计而不是合并(特别是如果一个图像是postgresql)