当前位置: 首页 > 知识库问答 >
问题:

如何在Docker容器中测试PHP API

司空胤
2023-03-14

我有一个用PHP/Symfony构建的api,在Docker容器中。我想测试一下。

为此:

>

第二:我运行测试:vendor/bin/simple phpunit

在我的测试中,我有以下要求:

$result = $this->client->request(
        'POST',
        '10.110.167.124:8080/api/v1/course_invoices',
        [
            RequestOptions::HEADERS => [
                'Accept' => 'application/ld+json',
                'Content-Type' => 'application/json',
                'Authorization' => "Bearer {$this->token}",
            ],
            RequestOptions::BODY => json_encode([
                'courseInstanceId' => self::COURSE_INSTANCE,
            ]),
        ]
    );

如您所见,我请求endpoint"10.110.167.124:8080/api/v1....."。它起作用了,但我知道我不能再这样下去了。

我试着用“localhost”、“localhost:8080”、“http://localhost”等...没有成功。我总是有这个错误:

GuzzleHttp\Exception\ConnectException:cURL错误7:无法连接到本地主机端口8080:连接被拒绝(请参阅https://curl.haxx.se/libcurl/c/libcurl-errors.html)

那么如何在容器内进行此测试呢?

我的码头工人

services:
  da-invoicing-php:
    build:
        context: .
        args:
            GITHUB_TOKEN: 060......2e8b
    container_name: da-invoicing-php
    depends_on:
      - da-invoicing-db
    env_file:
      - .env.local
    # Comment out this volume in production
    volumes:
      - .:/srv/api:rw,cached

  da-invoicing-api:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    depends_on:
      - da-invoicing-php
    volumes:
      - ./public:/srv/api/public:ro
    environment:
      - INTERNAL_DNS_RESOLVER=127.0.0.11
    ports:
      - "8080:80"

  da-invoicing-db:
    image: postgres:9.6-alpine
    environment:
      - POSTGRES_DB=api
      - POSTGRES_USER=api-platform
      # You should definitely change the password in production
      - POSTGRES_PASSWORD=!ChangeMe!
    ports:
      - "1234:5432"

我的Dockerfile:

    FROM php:7.3-fpm-alpine

RUN apk add --no-cache  \
        git

ARG http_proxy
ARG APCU_VERSION=5.1.17
RUN if [ ! -z $http_proxy ] ; then pear config-set http_proxy $http_proxy; fi \
  && set -xe \
    && apk add --no-cache --virtual .build-deps \
        $PHPIZE_DEPS \
        icu-dev \
        postgresql-dev \
        libzip-dev \
    && docker-php-ext-install -j$(nproc) \
        intl \
        pdo_pgsql \
        zip \
    && pecl install \
        apcu-${APCU_VERSION} \
    && pecl clear-cache \
    && docker-php-ext-enable --ini-name 20-apcu.ini apcu \
    && docker-php-ext-enable --ini-name 05-opcache.ini opcache \
    && runDeps="$( \
        scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
            | tr ',' '\n' \
            | sort -u \
            | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )" \
    && apk add --no-cache --virtual .api-phpexts-rundeps $runDeps \
    && apk del .build-deps

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Supervisor
RUN apk add --no-cache supervisor
COPY docker/php/supervisor/*.ini /etc/supervisor.d/

ARG XDEBUG=false
ARG XDEBUG_VERSION=2.6.0
RUN if [ "$XDEBUG" != "false" ] ;then \
    set -eux; \
    apk add --no-cache --virtual .build-deps $PHPIZE_DEPS; \
    pecl install xdebug-$XDEBUG_VERSION; \
    docker-php-ext-enable xdebug; \
    apk del .build-deps; \
fi

# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV COMPOSER_NO_INTERACTION=1
ARG GITHUB_TOKEN
RUN composer config -g github-oauth.github.com ${GITHUB_TOKEN}
RUN composer global require "symfony/flex" --prefer-dist --no-progress --no-suggest --classmap-authoritative \
    && composer clear-cache
ENV PATH="${PATH}:/root/.composer/vendor/bin"

WORKDIR /srv/api

# Build for production
ARG APP_ENV=prod

# Prevent the reinstallation of vendors at every changes in the source code
COPY composer.json composer.lock ./
RUN echo '<?php return [];' > .env.local.php

RUN composer install --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress --no-suggest \
    && composer clear-cache

# copy only specifically what we need
COPY bin bin/
COPY config config/
COPY public public/
COPY src src/
COPY .env ./

RUN set -eux; \
    mkdir -p var/cache var/log var/sessions; \
    composer dump-autoload --classmap-authoritative --no-dev; \
    composer run-script --no-dev post-install-cmd; \
    chmod +x bin/console; sync; \
    chown -R www-data var
    
VOLUME /srv/api/var

COPY docker/php/php.ini /usr/local/etc/php/php.ini
COPY docker/php/fpm.d/zz-academy.conf /usr/local/etc/php-fpm.d/
COPY docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint
COPY docker/php/fpm.d/zz-academy.conf /usr/local/etc/php-fpm.d/
RUN chmod +x /usr/local/bin/docker-entrypoint

EXPOSE 9000

ENTRYPOINT ["docker-entrypoint"]
CMD ["php-fpm"]

共有1个答案

易奇希
2023-03-14

您不能在PHP容器中直接使用localhost—它不提供HTTP服务,它是PHP fpm。

你必须调用nginx容器da-发票-api

$result = $this->client->request(
    'POST',
    'da-invoicing-api/api/v1/course_invoices',
    [
        RequestOptions::HEADERS => [
            'Accept' => 'application/ld+json',
            'Content-Type' => 'application/json',
            'Authorization' => "Bearer {$this->token}",
        ],
        RequestOptions::BODY => json_encode([
            'courseInstanceId' => self::COURSE_INSTANCE,
        ]),
    ]
);

Docker-comment为comment文件中的每个容器创建主机别名(同一网络上的其他容器可以使用服务名称)。

 类似资料:
  • 如何在docker容器中运行基于的测试用例? 我有一个简单的Spring Boot应用程序,它具有集成测试(组件级),使用与容器交互。测试用例正在破坏来自外部容器(本地机器)的罚款。 我们正在容器中运行所有内容,并且build正在docker jenkins映像上运行。Docker文件正在创建jar,然后创建image。找不到安装的docker。下面是我的docker文件。 处理这个案子最好的办法

  • 我清理了一个用Quarkus实现的旧Java项目,并将依赖项更新到Quarkus 2.4.0。然而,我注意到,当我启动应用程序时,它还启动了Docker PostgreSQL容器。我还有另一个数据库需要测试,所以我不需要Quarkus为我创建一个数据库。我找不到要在<code>应用程序中设置的任何配置属性。属性,以防止创建此属性。我遗漏了什么吗?有没有我需要设置的标志?

  • 问题内容: 有一个列出图像的命令,但是似乎没有对应的。 除了扎根并调查那里似乎没有办法。我想念什么吗?那是不应该做的事情吗? 问题答案: 要仅显示 正在运行的容器,请 使用给定命令: 要显示 所有容器,请 使用给定命令: 要显示 最新创建的容器 (包括所有状态),请使用给定命令: 要显示 n个最后创建的容器 (包括所有状态),请使用给定命令: 要显示 总文件大小,请 使用给定命令: 上面显示的内容

  • 问题内容: 使用来自注册表的docker映像时,我经常需要查看映像容器创建的卷。 注意:我在Red Hat 7上使用Docker版本1.3.2。 例 来自Docker Registry 的官方映像在处为容器配置了一个卷。 在容器中显示体积最简洁的命令是什么? 问题答案: 使用来获取容器ID。 然后 例: 1号航站楼 2号航站楼 输出 显然是由于使用 Go 语言来实现docker命令工具。 在没有命

  • 问题内容: 通常,docker容器使用 root 用户运行。我想使用其他用户,使用docker的USER指令没问题。但是该用户应该能够在容器内使用 sudo 。该命令丢失。 这是用于此目的的简单Dockerfile: 运行此容器,我以用户’docker’登录。当我尝试使用sudo时,找不到命令。所以我尝试使用以下方法在Dockerfile中安装 sudo 软件包 这导致 无法找到包sudo 问题答