如何解决如何在构建时在Docker映像之间联网?
我有一个项目sample
,它在database
中声明了两个服务,app
和docker-compose.yml
:
version: "3.8"
services:
database:
image: sample/database
build:
context: .
dockerfile: database.Dockerfile
network: sample_default
ports:
- "8001:5432"
app:
image: sample/app
build:
context: .
dockerfile: app.Dockerfile
network: sample_default
args:
- DATABASE_URL=postgresql://postgres:password@database:5432/cluster
depends_on:
- database
networks:
sample_default: {}
database.Dockerfile
负责下载和安装Postgre,以及在该集群中启动Postgre集群和数据库。该数据库的表是通过CREATE TABLE
命令在构建时通过RUN
创建的。
app.Dockerfile
负责下载和安装编译器以及编译源代码。
要构建app.Dockerfile
的图像,必须先构建database.Dockerfile
的图像。这是因为在编译时,针对database.Dockerfile
中创建的数据库验证了源代码中的SQL查询字符串。
编译器使用DATABASE_URL
连接到Postgre数据库,该数据库包含用于验证查询依据的表。在此DATABASE_URL
中,指定的地址为database:5432
,因为可以在非默认桥网络上使用服务发现。
我的问题是,在运行docker-compose up
时,在构建时app
无法在构建时连接到database
。 RUN ping database
中的app.Dockerfile
失败,出现ping: database: No address associated with hostname
。但是,从sample_default
网络上的两个映像启动容器(手动而不是通过docker-compose
)并从ping database
的容器运行app
是成功的。
我已经在network
的{{1}}下指定了build
,那么在此之上我还能做什么呢?
解决方法
在构建时,没有网络配置出现。因为Docker容器就像VM。您无法在启动时通过其IP地址连接到VM。 docker容器也一样。唯一的不同是容器快速启动过程比虚拟机快。因此,您需要等到它出现。启动容器后,其生命周期就是运行时。
,在yml文件中添加Depends_on部分。 例如。
version: "3.8"
services:
database:
image: sample/database
build:
context: .
dockerfile: database.Dockerfile
network: sample_default
ports:
- "8001:5432"
app:
image: sample/app
build:
context: .
dockerfile: app.Dockerfile
network: sample_default
args:
- DATABASE_URL=postgresql://postgres:password@database:5432/cluster
depends_on:
- database
networks:
sample_default: {}
,
正如我已经看到的那样,您已经使用depends_on,这已经是一个不错的开始;)
以下是我的另一个项目之一的有效docker-compose.yml,在另一个docker-compose版本中,我建议:
- 您可能需要一个custom network bridge
- 您可以在其中为每个图像分配自定义IP地址
- 和subnet with a valid CIDR
我需要建立数据库连接,以便我可以通过服务器在docker网络中针对mongo db在docker网络中运行量角器ui-test,因此,我还需要对服务器上的特定端口进行运行状况检查。如果失败,UI测试将重新启动。
version: "3" # docker-compose version: 1.21.1 for version 3 misleading I know: check out https://sreeninet.wordpress.com/2017/03/28/comparing-docker-compose-versions/
services:
server:
build: server # frontend code stored as static files in node server
ports:
- "4000:4000"
- "8443:8443"
links:
- mongo
depends_on:
- mongo
networks:
app_net:
ipv4_address: 192.17.1.3
healthcheck:
# test: ["CMD","curl","-k","https://localhost:8443"]
# test: ifconfig
test: curl -k http://192.17.1.3:8443
# test: curl http://localhost:8443/bundle.js -k -s | grep -C 3 "window.pushNotification"
interval: 30s
timeout: 10s
retries: 3
mongo:
image: mongo # pulling on docker-compose up if image not available
# volumes: # TODO mongo2.6
# - /Users/yuqiuge/Downloads/mongodb-osx-x86_64-2.6.10/data/db:/data/db
# - /data/db:/data/db
ports:
- "27017:27017"
networks:
app_net:
# static different ip for mongo
ipv4_address: 192.17.1.2
protractor:
build: webapp
restart: on-failure
depends_on:
- server
links:
- server
networks:
app_net:
# static different ip for ui test on webapp
ipv4_address: 192.17.1.4
networks:
app_net:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
ipam:
driver: default
config:
- subnet: 192.17.1.0/24
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。