【问题标题】:Run docker image with docker-compose使用 docker-compose 运行 docker 镜像
【发布时间】:2017-01-05 09:10:23
【问题描述】:

我有一个简单的 C# 应用程序,它与 postgreSQL 连接。 我想用这个应用程序创建图像,然后用 docker 运行。

我使用时一切正常:

$ docker build
$ docker run postgres
$ docker run my_app

此外,当我从应用程序目录使用 compose 时,一切正常:

$ docker-compose build
$ docker-compose up

但是有没有机会为我之前构建的图像使用 docker-compose?

我想将此图像发布到我的存储库,我团队中的其他人只需下载并运行此图像(应用程序 + 数据库)。

当我进行 compose-build 和下一次 compose 运行 my_app 时,我在连接数据库时出现异常:

dbug: Npgsql.NpgsqlConnection[3]
      Opening connection to database 'POSTGRES_USER' on server 'tcp://postgres:5432'.

Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.AggregateException: One or more errors occurred. (No such device or address) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address

我当前的 docker-compose.yml 文件:

version: '2'

services:

  web:
    container_name: 'postgrescoreapp'
    image: 'postgrescoreapp'
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/postgrescoreapp
    ports:
     - "5001:5001"
    depends_on:
     - "postgres"
    networks:
      - postgrescoreapp-network

  postgres:
    container_name: 'postgres'
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
    networks:
      - postgrescoreapp-network

networks:
  postgrescoreapp-network:
    driver: bridge

【问题讨论】:

  • 你应该能够创建一个使用你自己的图像的 docker compose 配置,当然。使用buildimage 属性来构建您的图像或使用预定义的(在您的存储库中托管):docs.docker.com/compose/compose-file
  • 我已经在我的 docker-compose.yml 文件中使用了它。
  • 那你的问题是什么?
  • 当我执行 docker-compose build 和 docker run my_app 时,我的应用程序无法与 postres 连接,我做错了什么
  • 那么我建议您将它与您的 Docker Compose 文件以及您用来运行的命令一起添加到您的问题中......目前,它不包括任何这些。

标签: c# postgresql docker docker-compose dockerfile


【解决方案1】:

您应该使用以下名称构建映像:(registryName:RegistryPort)/imagename:version

$ docker build -t myRegistry.example.com:5000/myApp:latest .
$ docker build -t myRegistry.example.com:5000/myDb:latest .

现在将这些行添加到 docker-compose 文件中:

Myapp:                                                    
  image: myRegistry.example.com:5000/myApp:latest 

MyDb:                        
  image: myRegistry.example.com:5000/myDb:latest

然后推送:

$ docker push myRegistry.example.com:5000/myApp:latest
$ docker push myRegistry.example.com:5000/myDb:latest

你的伴侣现在应该可以拉它了

$ docker pull myRegistry.example.com:5000/myApp:latest
$ docker pull myRegistry.example.com:5000/myDb:latest

【讨论】:

  • 是的,它也会运行。但我只想用 docker-compose 运行。一个命令应该使用数据库运行我的应用程序
  • 那么你只需要执行“docker-compose up -d”,它会同时运行两个应用程序
【解决方案2】:

是的,您可以通过docker compose 使用以前从repository 创建的图像。

示例:

version: '2'
services:
  app:
    image: farhad/my_app
    ports:
      - "80:80"
    networks:
      - testnetwork
  postgres:
    image: postgres:latest
    networks:
      - testnetwork
networks:
  testnetwork:
    external: true

示例说明:

我正在从我的存储库创建一个名为 app 的容器,并通过库 postgres 图像创建另一个名为 postgres 的容器。

请注意,您需要先创建一个将您的自定义图像推送到存储库。

我在这里使用user-defined 网络,您需要在docker-compose up 之前创建testnetwork

【讨论】:

  • 我有这个结构相似的 docker-compose.yml 文件。我的应用程序运行,但在连接到 postres 期间出现异常。我的连接字符串是:“User ID=postgres;Password=password;Server=postgres;Port=5432;Database=POSTGRES_USER;Integrated Security=true;Pooling=true;”如上所述,它适用于两种情况。
  • 来自 docker-compose 还是 docker build? docker-compose 工作正常,但仅当我从应用程序目录运行此命令时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2016-11-14
相关资源
最近更新 更多