当使用docker-compose

时间:2017-10-10 14:15:29

标签: docker docker-compose docker-container docker-link

我们想做什么:

我们希望使用 docker-compose 将一个已经运行的容器(A)链接到另一个容器(B)按容器名称。我们使用“ external-link ”,因为两个容器都是从不同的docker-compose.yml文件启动的。

问题:

尽管具有该名称的容器正在运行,但容器B无法以错误启动。

ERROR: for container_b  Cannot start service container_b: Cannot link to a non running container: /PREVIOUSLY_LINKED_ID_container_a_1 AS /container_b_1/container_a_1

输出“docker ps”

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                         NAMES
RUNNING_ID        container_a       "/docker-entrypoint.s"   15 minutes ago      Up 15 minutes       5432/tcp                      container_a_1

示例代码:

Container B的docker-compose.yml

container_b:
  external_links:
  - container_a_1

这个问题与其他“如何解决”问题有什么不同?

  • 我们不能使用“sudo service docker restart”(有效),因为这是一个生产环境
  • 我们不想每次手动修复此问题,但我们可以找到原因
    • 了解我们做错了什么
    • 了解如何避免此

假设:

  • 似乎存在container_a的两个实例(RUNNING_ID和PREVIOUSLY_LINKED_ID)
  • 这可能因为我们而发生
    • 通过docker-compose build和
    • 重建容器
    • 更改了容器的转发外部端口(808 0 1 :8080)

注释

  • 请勿按照评论中的建议使用docker-compose down,这会删除volumnes!

1 个答案:

答案 0 :(得分:1)

Docker links are deprecated所以,除非你需要一些功能,否则我们建议切换到泊坞网络。

由于您要连接的容器似乎是在单独的撰写文件中启动的,因此您可以在外部创建该网络:

namespace App;

use App\Services\Search\Builders\ListingRecordBuilder;

use Laravel\Scout\Searchable;
.
.
.

class Listings extends BaseModel
{
    use Searchable;
.
.
.
    public function searchableAs()
    {
        return 'local_listings_new';
    }

    public function toSearchableArray()
    {
        $recordBuilder = new ListingRecordBuilder($this);

        return $recordBuilder->buildRecord();
    }
}

然后在您的docker-compose.yml文件中,将容器连接到该网络:

docker network create app_net

然后在您的container_b中,您将连接到container_a作为“container_a”,而不是“container_a_1”。

除此之外,除非您传递version: '3' networks: app_net: external: name: app_net services: container_a: # ... networks: - app_net 标记,否则不会记录docker-compose down以删除卷。也许您使用的是匿名卷,在这种情况下,我不确定-v是否知道在哪里可以找到您的数据。命名卷是首选。很可能,您的数据未存储在卷中,这很危险,并且无法更新容器:

docker-compose up