我正在设置的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访问时,我得到了错误。这是不是不可能在构建时做我想做的事情?
1条答案
按热度按时间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命令。
字符串
COPY
这个文件到图像,使它成为ENTRYPOINT
,并保持CMD
不变。型
这将在每次启动时运行迁移,这通常是您想要的。