{"meta":{"title":"Создание контейнеров служб PostgreSQL","intro":"Вы можете создать контейнер службы PostgreSQL, который будет использоваться в вашем рабочем процессе. В этом руководстве показаны примеры создания службы PostgreSQL для заданий, которые выполняются в контейнерах или непосредственно на компьютере средства выполнения тестов.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/use-containerized-services","title":"Использование контейнерных служб"},{"href":"/ru/actions/tutorials/use-containerized-services/create-postgresql-service-containers","title":"Создание контейнеров служб PostgreSQL"}],"documentType":"article"},"body":"# Создание контейнеров служб PostgreSQL\n\nВы можете создать контейнер службы PostgreSQL, который будет использоваться в вашем рабочем процессе. В этом руководстве показаны примеры создания службы PostgreSQL для заданий, которые выполняются в контейнерах или непосредственно на компьютере средства выполнения тестов.\n\n## Введение\n\nВ этом руководстве показаны примеры рабочих процессов, которые настраивают сервисный контейнер с помощью изображения Docker Hub `postgres`. Рабочий процесс запускает сценарий, который подключается к службе PostgreSQL, создает таблицу, а затем заполняет ее данными. Чтобы убедиться в том, что рабочий процесс создает и заполняет таблицу PostgreSQL, сценарий выводит данные из таблицы в консоль.\n\n> \\[!NOTE]\n> Если в рабочих процессах используются действия контейнеров Docker, контейнеры заданий или контейнеры служб, необходимо использовать средство выполнения Linux:\n>\n> * При использовании размещенных в GitHub средств выполнения необходимо применять средство выполнения Ubuntu.\n> * Если вы применяете локальные средства выполнения, необходимо использовать компьютер Linux в качестве средства выполнения, а Docker нужно установить.\n\n## Необходимые компоненты\n\nВы должны знать, как работают контейнеры GitHub Actions служб и сетевые различия между выполнением заданий непосредственно на средстве выполнения или в контейнере. Дополнительные сведения см. в разделе [Взаимодействие с контейнерами служб Docker](/ru/actions/tutorials/use-containerized-services/use-docker-service-containers).\n\nВы также можете найти полезное представление о YAML, синтаксисе и GitHub ActionsPostgreSQL. Дополнительные сведения см. в разделе:\n\n* [Написание рабочих процессов](/ru/actions/how-tos/write-workflows)\n* [Руководство](https://www.postgresqltutorial.com/) по PostgreSQL в документации по PostgreSQL\n\n## Выполнение заданий в контейнерах\n\nНастройка заданий для запуска в контейнере упрощает сетевые конфигурации между заданием и контейнерами служб. Контейнеры Docker в одной пользовательской сети моста предоставляют все порты друг другу, поэтому вам не нужно сопоставлять порты контейнера службы с узлом Docker. Вы можете получить доступ к контейнеру службы из контейнера заданий с помощью метки, настроенной в рабочем процессе.\n\nЭтот файл рабочего процесса можно скопировать в каталог `.github/workflows` репозитория и при необходимости изменить его.\n\n```yaml copy\nname: PostgreSQL service example\non: push\n\njobs:\n  # Label of the container job\n  container-job:\n    # Containers must run in Linux based operating systems\n    runs-on: ubuntu-latest\n    # Docker Hub image that `container-job` executes in\n    container: node:20-bookworm-slim\n\n    # Service containers to run with `container-job`\n    services:\n      # Label used to access the service container\n      postgres:\n        # Docker Hub image\n        image: postgres\n        # Provide the password for postgres\n        env:\n          POSTGRES_PASSWORD: postgres\n        # Set health checks to wait until postgres has started\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n\n    steps:\n      # Downloads a copy of the code in your repository before running CI tests\n      - name: Check out repository code\n        uses: actions/checkout@v6\n\n      # Performs a clean installation of all dependencies in the `package.json` file\n      # For more information, see https://docs.npmjs.com/cli/ci.html\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Connect to PostgreSQL\n        # Runs a script that creates a PostgreSQL table, populates\n        # the table with data, and then retrieves the data.\n        run: node client.js\n        # Environment variables used by the `client.js` script to create a new PostgreSQL table.\n        env:\n          # The hostname used to communicate with the PostgreSQL service container\n          POSTGRES_HOST: postgres\n          # The default PostgreSQL port\n          POSTGRES_PORT: 5432\n```\n\n### Настройка задания runner для заданий в контейнерах\n\nЭтот рабочий процесс настраивает задание, которое выполняется в контейнере `node:20-bookworm-slim` и использует `ubuntu-latest` средство запуска  GitHub, размещенное в качестве узла Docker для контейнера. Дополнительные сведения о контейнере `node:20-bookworm-slim` см. в статье об [образе узла](https://hub.docker.com/_/node) в Docker Hub.\n\nРабочий процесс настраивает контейнер службы с меткой `postgres`. Все службы должны выполняться в контейнере, поэтому для каждой из них требуется указать `image` контейнера. Этот пример использует образ контейнера `postgres`, предоставляет пароль PostgreSQL по умолчанию и включает параметры проверки работоспособности, чтобы была возможность убедиться, что служба запущена. Дополнительные сведения см. в разделе [Образ Postgres](https://hub.docker.com/_/postgres) на Docker Hub.\n\n```yaml copy\njobs:\n  # Label of the container job\n  container-job:\n    # Containers must run in Linux based operating systems\n    runs-on: ubuntu-latest\n    # Docker Hub image that `container-job` executes in\n    container: node:20-bookworm-slim\n\n    # Service containers to run with `container-job`\n    services:\n      # Label used to access the service container\n      postgres:\n        # Docker Hub image\n        image: postgres\n        # Provide the password for postgres\n        env:\n          POSTGRES_PASSWORD: postgres\n        # Set health checks to wait until postgres has started\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n```\n\n### Настройка шагов для заданий в контейнерах\n\nРабочий процесс выполняет следующие действия:\n\n1. извлекает репозиторий в средстве выполнения;\n2. устанавливает зависимости;\n3. выполняет скрипт для создания клиента.\n\n```yaml copy\nsteps:\n  # Downloads a copy of the code in your repository before running CI tests\n  - name: Check out repository code\n    uses: actions/checkout@v6\n\n  # Performs a clean installation of all dependencies in the `package.json` file\n  # For more information, see https://docs.npmjs.com/cli/ci.html\n  - name: Install dependencies\n    run: npm ci\n\n  - name: Connect to PostgreSQL\n    # Runs a script that creates a PostgreSQL table, populates\n    # the table with data, and then retrieves the data.\n    run: node client.js\n    # Environment variable used by the `client.js` script to create\n    # a new PostgreSQL client.\n    env:\n      # The hostname used to communicate with the PostgreSQL service container\n      POSTGRES_HOST: postgres\n      # The default PostgreSQL port\n      POSTGRES_PORT: 5432\n```\n\nСкрипт *client.js* ищет переменные среды `POSTGRES_HOST` и `POSTGRES_PORT` для создания клиента. Эти две переменные среды задаются на шаге рабочего процесса \"Подключение к PostgreSQL\", после чего становятся доступны скрипту *client.js*. Дополнительные сведения о скрипте см. в разделе [\"Тестирование контейнера](#testing-the-postgresql-service-container) службы PostgreSQL\".\n\nИмя узла службы PostgreSQL — это метка, настроенная в рабочем процессе; в данном случае — `postgres`. Так как контейнеры Docker в той же пользовательской сети моста открывают все порты по умолчанию, вы можете получить доступ к контейнеру службы через стандартный порт PostgreSQL 5432.\n\n## Выполнение заданий непосредственно на компьютере средства выполнения тестов\n\nПри запуске задания непосредственно на компьютере средства выполнения тестов необходимо сопоставить порты контейнера службы с портами на узле Docker. Вы можете получить доступ к контейнерам служб из узла Docker, используя `localhost` и номер порта узла Docker.\n\nЭтот файл рабочего процесса можно скопировать в каталог `.github/workflows` репозитория и при необходимости изменить его.\n\n```yaml copy\nname: PostgreSQL Service Example\non: push\n\njobs:\n  # Label of the runner job\n  runner-job:\n    # You must use a Linux environment when using service containers or container jobs\n    runs-on: ubuntu-latest\n\n    # Service containers to run with `runner-job`\n    services:\n      # Label used to access the service container\n      postgres:\n        # Docker Hub image\n        image: postgres\n        # Provide the password for postgres\n        env:\n          POSTGRES_PASSWORD: postgres\n        # Set health checks to wait until postgres has started\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          # Maps tcp port 5432 on service container to the host\n          - 5432:5432\n\n    steps:\n      # Downloads a copy of the code in your repository before running CI tests\n      - name: Check out repository code\n        uses: actions/checkout@v6\n\n      # Performs a clean installation of all dependencies in the `package.json` file\n      # For more information, see https://docs.npmjs.com/cli/ci.html\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Connect to PostgreSQL\n        # Runs a script that creates a PostgreSQL table, populates\n        # the table with data, and then retrieves the data\n        run: node client.js\n        # Environment variables used by the `client.js` script to create\n        # a new PostgreSQL table.\n        env:\n          # The hostname used to communicate with the PostgreSQL service container\n          POSTGRES_HOST: localhost\n          # The default PostgreSQL port\n          POSTGRES_PORT: 5432\n```\n\n### Настройка задания runner для заданий непосредственно на компьютере runner\n\nВ примере используется `ubuntu-latest` метод  GitHub, размещенный в в качестве узла Docker.\n\nРабочий процесс настраивает контейнер службы с меткой `postgres`. Все службы должны выполняться в контейнере, поэтому для каждой из них требуется указать `image` контейнера. Этот пример использует образ контейнера `postgres`, предоставляет пароль PostgreSQL по умолчанию и включает параметры проверки работоспособности, чтобы была возможность убедиться, что служба запущена. Дополнительные сведения см. в разделе [Образ Postgres](https://hub.docker.com/_/postgres) на Docker Hub.\n\nРабочий процесс сопоставляет порт 5432 в контейнере службы PostgreSQL с узлом Docker. Дополнительные сведения о ключевом слове `ports` см. в разделе [Взаимодействие с контейнерами служб Docker](/ru/actions/tutorials/use-containerized-services/use-docker-service-containers#mapping-docker-host-and-service-container-ports).\n\n```yaml copy\njobs:\n  # Label of the runner job\n  runner-job:\n    # You must use a Linux environment when using service containers or container jobs\n    runs-on: ubuntu-latest\n\n    # Service containers to run with `runner-job`\n    services:\n      # Label used to access the service container\n      postgres:\n        # Docker Hub image\n        image: postgres\n        # Provide the password for postgres\n        env:\n          POSTGRES_PASSWORD: postgres\n        # Set health checks to wait until postgres has started\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          # Maps tcp port 5432 on service container to the host\n          - 5432:5432\n```\n\n### Настройка шагов для заданий непосредственно на компьютере runner\n\nРабочий процесс выполняет следующие действия:\n\n1. извлекает репозиторий в средстве выполнения;\n2. устанавливает зависимости;\n3. выполняет скрипт для создания клиента.\n\n```yaml copy\nsteps:\n  # Downloads a copy of the code in your repository before running CI tests\n  - name: Check out repository code\n    uses: actions/checkout@v6\n\n  # Performs a clean installation of all dependencies in the `package.json` file\n  # For more information, see https://docs.npmjs.com/cli/ci.html\n  - name: Install dependencies\n    run: npm ci\n\n  - name: Connect to PostgreSQL\n    # Runs a script that creates a PostgreSQL table, populates\n    # the table with data, and then retrieves the data\n    run: node client.js\n    # Environment variables used by the `client.js` script to create\n    # a new PostgreSQL table.\n    env:\n      # The hostname used to communicate with the PostgreSQL service container\n      POSTGRES_HOST: localhost\n      # The default PostgreSQL port\n      POSTGRES_PORT: 5432\n```\n\nСкрипт *client.js* ищет переменные среды `POSTGRES_HOST` и `POSTGRES_PORT` для создания клиента. Эти две переменные среды задаются на шаге рабочего процесса \"Подключение к PostgreSQL\", после чего становятся доступны скрипту *client.js*. Дополнительные сведения о скрипте см. в разделе [\"Тестирование контейнера](#testing-the-postgresql-service-container) службы PostgreSQL\".\n\nИмя узла — `localhost` или `127.0.0.1`.\n\n## Тестирование контейнера службы PostgreSQL\n\nВы можете протестировать рабочий процесс с помощью следующего сценария, который подключается к службе PostgreSQL и добавляет новую таблицу с данными заполнителей. Затем сценарий выводит в терминал значения, хранящиеся в таблице PostgreSQL. Сценарий может использовать любой выбранный язык, но в этом примере используется Node.js и модуль npm `pg`. Дополнительные сведения см. в [модуле npm pg](https://www.npmjs.com/package/pg).\n\nВы можете изменить *client.js*, чтобы включить все операции PostgreSQL, необходимые для вашего рабочего процесса. В этом примере сценарий подключается к службе PostgreSQL, добавляет таблицу в базу данных `postgres`, вставляет данные заполнителей, а затем извлекает данные.\n\nДобавьте в репозиторий новый файл *client.js* с приведенным ниже кодом.\n\n```javascript copy\nconst { Client } = require('pg');\n\nconst pgclient = new Client({\n    host: process.env.POSTGRES_HOST,\n    port: process.env.POSTGRES_PORT,\n    user: 'postgres',\n    password: 'postgres',\n    database: 'postgres'\n});\n\npgclient.connect();\n\nconst table = 'CREATE TABLE student(id SERIAL PRIMARY KEY, firstName VARCHAR(40) NOT NULL, lastName VARCHAR(40) NOT NULL, age INT, address VARCHAR(80), email VARCHAR(40))'\nconst text = 'INSERT INTO student(firstname, lastname, age, address, email) VALUES($1, $2, $3, $4, $5) RETURNING *'\nconst values = ['Mona the', 'Octocat', 9, '88 Colin P Kelly Jr St, San Francisco, CA 94107, United States', 'octocat@github.com']\n\npgclient.query(table, (err, res) => {\n    if (err) throw err\n});\n\npgclient.query(text, values, (err, res) => {\n    if (err) throw err\n});\n\npgclient.query('SELECT * FROM student', (err, res) => {\n    if (err) throw err\n    console.log(err, res.rows) // Print the data in student table\n    pgclient.end()\n});\n```\n\nСценарий создает новое подключение к службе PostgreSQL и использует переменные среды `POSTGRES_HOST` и `POSTGRES_PORT` для указания IP-адреса и порта службы PostgreSQL. Если `host` и `port` не определены, по умолчанию используется узел `localhost` и порт 5432.\n\nСценарий создает таблицу и заполняет ее данными заполнителя. Чтобы убедиться в том, что база данных `postgres` содержит эти данные, сценарий выводит содержимое базы данных в журнал консоли.\n\nПри запуске этого рабочего процесса вы увидите следующие выходные данные на шаге «Подключение к PostgreSQL», который подтверждает успешное создание таблицы PostgreSQL и добавление данных:\n\n```text\nnull [ { id: 1,\n    firstname: 'Mona the',\n    lastname: 'Octocat',\n    age: 9,\n    address:\n     '88 Colin P Kelly Jr St, San Francisco, CA 94107, United States',\n    email: 'octocat@github.com' } ]\n```"}