在新容器Docker构建期间访问正在运行的容器

时间:2020-05-26 05:11:53

标签: docker docker-compose

如何在新的容器docker构建期间访问正在运行的容器?

在构建应用程序容器期间需要访问数据库容器

docker-compose

version: '3'

services:
  db:
    build: ./db
    ports:
      - 1433:1433
    networks:
      - mynetwork
  app:
    build: ./app
    ports:
      - 8080:8080
    depends_on:
      - db
    networks:
      - mynetwork

networks:
  mynetwork: {}

试图在构建应用容器之前启动数据库,但无法正常工作

  • docker-compose build db
  • docker-compose up -d db
  • docker-compose构建应用

1 个答案:

答案 0 :(得分:1)

你不能,这不是一个好主意。例如,如果您运行:

docker-compose build
docker-compose down -v
docker-compose up

down步骤将删除所有容器及其底层存储(包括数据库的内容);那么up步骤将根据现有映像创建所有新容器,而无需重新运行Dockerfile。即使添加了--build选项,Docker的层缓存也会得出结论,数据库设置命令的文件系统输出未更改,并且将跳过重新运行该步骤的过程。

如果您将构建的映像docker push到某个注册表并在其他主机上运行,​​则会遇到类似的问题:由于该映像可重用,因此其Dockerfile中的命令将无法重新运行,但是不是同一个数据库,因此设置将无法完成。

取决于您要尝试的设置类型,最好的方法可能是使用运行应用程序的数据库迁移的入口点脚本配置映像,然后exec "$@"运行main container命令。将设置命令放在数据库的/docker-entrypoint-initdb.d目录中也可以起作用,尽管如果您的应用程序的数据库架构发生更改,则这些设置命令不会重新运行。

在技术层面上,这是行不通的,因为docker build环境不在任何特定的Docker网络上,您手动指定的mynetwork或Compose创建的default网络都没有在其自己的。构建序列与运行结果映像分开运行,并且忽略了大多数Docker Compose设置。

相关问题