【问题标题】:How to connect to other container from Dockerfile while docker-compose builddocker-compose build 时如何从 Dockerfile 连接到其他容器
【发布时间】:2020-11-07 10:38:15
【问题描述】:

我尝试为我的 php 项目配置 docker compose。在部署时,我想更新源代码、更新作曲家依赖项并运行数据库迁移。

所以我有一个docker-compose.yml 文件:

version: '3.0'
services:
  php:
    build: 
      context: .
      dockerfile: php/Dockerfile
    depends_on:
      - postgres
  postgres:
    image: "postgres:13-alpine"
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB_NAME}

从下一个 Dockerfile 构建 PHP 容器:


# Inatall dependensies
RUN apt-get update \
&& apt-get install -y git libicu-dev postgresql-server-dev-all zip libzip-dev postgresql-client\
&& docker-php-ext-install intl pdo pdo_pgsql zip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Copy source files
COPY ./app /var/www/my-site

# Update project files
WORKDIR /var/www/my-site
RUN composer install
RUN php ./yii migrate --interactive=0 # This command needs to connect to the database and fails

CMD [ "php-fpm"]

当我运行docker-compose build 时,出现此错误:could not translate host name "postgres" to address: Name or service not known

如何在其他容器构建时访问数据库容器?

【问题讨论】:

  • 你找到解决办法了吗?
  • 没有。 :( 我使用 hack 来解决我的问题。我构建和运行容器而不运行数据库迁移。之后我通过docker-compose exec 在 PHP 容器中运行迁移。我为它编写了一个简单的 bash 脚本。
  • 听起来不错,在运行任何迁移之前需要启动数据库。这就是我的解决方案。

标签: docker docker-compose dockerfile


【解决方案1】:

phppostgres 都需要在同一个网络上,php 可以使用container_name 访问postgres,即postgresdepends_on 将确保 postgresphp 之前开始。

version: '3.0'
services:
  php:
    build: 
      context: .
      dockerfile: php/Dockerfile
    restart: on-failure
    depends_on:
      - postgres
    networks:
      - test-network

  postgres:
    container_name: 'postgres'
    image: "postgres:13-alpine"
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB_NAME}
    networks:
      - test-network

networks:
  test-network:
    driver: bridge

【讨论】:

  • 很抱歉,它不起作用。我试了一下,也出现了同样的错误。
  • 很遗憾听到这个消息,请看这个帖子,它有几个解决方案。
  • 我的理解是,docker-compose 首先构建容器。只有当所有这些都准备好时,它才会将它们与联合运行到一个网络中。所以在构建完成之前我们不能使用网络。
  • 您希望在构建映像后也运行容器,对吧?如果您不确定,请查看此答案link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2017-07-11
  • 2021-06-04
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多