Docker compose networks在构建时对dockerfiles可用吗?

qgelzfjb  于 2023-11-17  发布在  Docker
关注(0)|答案(1)|浏览(101)

我正在设置的Web服务器包含一个docker-compose.yml,它由一个节点和postgres服务组成。一旦容器运行,我就可以使用postgres容器的名称作为主机从节点容器与数据库对话。
然而,我想将数据库迁移逻辑集成到我的节点服务的dockerfile中,连接失败并出现错误:
无法解析host:db
这是我的配置的简化版本,以显示错误:

FROM node:18-alpine AS builder

## ...Setup...

## Connect to database in order to migrate which essentially does this
RUN apk add curl
RUN curl http://db:5432
# And fails with the above error

## More stuff

# Stage Container
FROM node:18-alpine

# Stuff

## Run application
CMD ["node", "build/index.js"]

字符串
当从运行的容器通过db:5432访问数据库时,没有任何问题-但是当我尝试从dockerfile访问时,我得到了错误。这是不是不可能在构建时做我想做的事情?

68bkxrlz

68bkxrlz1#

Docker compose networks在构建时对dockerfiles可用吗?

我想将数据库迁移逻辑集成到dockerfile中....我想在构建时做的事情是不可能的吗?
不可能的
考虑一下你在Compose文件中运行的postgres镜像。你没有下载它的Dockerfile并从源代码重建它;相反,你下载了一个预编译的镜像。每个Docker镜像都是这样工作的:原则上,你可以将你构建的应用程序docker-compose build && docker-compose push到某个Docker注册表中,然后将它拉到其他地方运行,而不需要重建它。
但现在,应用程序数据不是映像的一部分。它存储在PostgreSQL数据库中,通常存储在仅存在于您的机器上的命名卷中。构建Node应用程序映像不会将另一个容器的不透明数据沿着。
使用这种操作模式,存在一些技术挑战。镜像构建器不运行在Compose提供的网络上,而是运行在不包括一些标准Docker功能的“默认桥接网络”上。在一个镜像构建和另一个镜像运行之间也没有顺序约束;在docker-compose up启动数据库之前,docker-compose build应用程序是正常的。
这里的一个典型方法是在一个 *entrypoint wrapper脚本 * 中运行迁移。编写一个shell脚本来运行迁移,然后运行传递给它的任何Docker命令。

#!/bin/sh
npm run migrate
exec "$@"

字符串
COPY这个文件到图像,使它成为ENTRYPOINT,并保持CMD不变。

COPY entrypoint.sh ./  # could be part of COPY ./ ./
ENTRYPOINT ["./entrypoint.sh"]
CMD ["node", "build/index.js"]


这将在每次启动时运行迁移,这通常是您想要的。

相关问题