Разбор ошибок чтения строки подключения при преобразовании в Docker Secret - PullRequest
0 голосов
/ 08 июля 2019

Я создал пример приложения, чтобы узнать о Docker. Я конвертирую всю свою конфиденциальную информацию в секреты, используя docker-compose. Имена пользователей и пароли работают как секреты, но когда я преобразую строку подключения в секрет, я получаю ошибку разбора.

Я сравнил значение переменной среды при использовании секрета, а когда не секрет, и они кажутся идентичными.

Использование секрета Docker:

$> docker exec 139 bash -c 'echo "$DB_CONNECTION_STRING"'
/run/secrets/connection_string
$> docker exec 139 cat /run/secrets/connection_string
host=postgres_image;port=5432;database=blogdb;username=bloguser;password=bloguser

Использование простого текста:

$> docker exec 4dd bash -c 'echo "$DB_CONNECTION_STRING"'
host=postgres_image;port=5432;database=blogdb;username=bloguser;password=bloguser

При использовании простого текста для строки подключения в docker-compose.yml, API работает нормально и отвечает правильно. Но когда я преобразую строку подключения в секрет докера, я получаю следующую ошибку при вызове API:

ArgumentException: Format of the initialization string does not conform to specification starting at index 0.
System.Data.Common.DbConnectionOptions.GetKeyValuePair(string connectionString, int currentPosition, StringBuilder buffer, bool useOdbcRules, out string keyname, out string keyvalue)
System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary<string, string> parsetable, string connectionString, bool buildChain, Dictionary<string, string> synonyms, bool firstKey)
System.Data.Common.DbConnectionOptions..ctor(string connectionString, Dictionary<string, string> synonyms, bool useOdbcRules)
System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(string value)
Npgsql.NpgsqlConnection.GetPoolAndSettings()
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlRelationalConnection.CreateDbConnection()
Microsoft.EntityFrameworkCore.Internal.LazyRef<T>.get_Value()
Microsoft.EntityFrameworkCore.Storage.RelationalConnection.get_DbConnection()
Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(bool errorsExpected)
Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable<T>+Enumerator.BufferlessMoveNext(DbContext _, bool buffer)
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.Execute<TState, TResult>(TState state, Func<DbContext, TState, TResult> operation, Func<DbContext, TState, ExecutionResult<TResult>> verifySucceeded) ...

Это составной файл с реализованными секретами. Обратите внимание, что секреты db_username, db_password и db_name работают нормально. Только секрет connection_string вызывает ошибку.

version: '3.4'

networks:
  blogapi-dev:
    driver: bridge

services:
  blogapi:
    image: blogapi:latest
    depends_on:
      - "postgres_image"
    build:
      context: .
      dockerfile: BlogApi/Dockerfile
    expose:
      - "8000"
    environment:
      DB_CONNECTION_STRING: /run/secrets/connection_string
      ASPNETCORE_ENVIRONMENT: development
      #REMOTE_DEBUGGING: ${REMOTE_DEBUGGING}
    networks:
      - blogapi-net
    tty: true
    stdin_open: true
    secrets:
      - connection_string

  postgres_image:
    image: postgres:latest
    ports:
      - "5000:80"
    restart: always
    volumes:
      - db_volume:/var/lib/postgresql/data
      - ./BlogApi/dbscripts/seed.sql:/docker-entrypoint-initdb.d/seed.sql
    environment:
      POSTGRES_USER_FILE: /run/secrets/db_username
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
      POSTGRES_DB_FILE: /run/secrets/db_name
    networks:
      - blogapi-net
    secrets:
      - db_username
      - db_password
      - db_name

  nginx-proxy:
    image: nginx:latest
    container_name: nginx-proxy
    build:
      context: .
      dockerfile: nginx-proxy/Dockerfile
    ports:
      - 80:80
      - 443:443
    networks:
      - blogapi-net
    depends_on:
      - "blogapi"
    volumes:
      - ./nginx-proxy/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx-proxy/error.log:/etc/nginx/error_log.log
      - ./nginx-proxy/cache/:/etc/nginx/cache
      - /etc/letsencrypt/:/etc/letsencrypt/
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./:/etc/nginx/

networks:
  blogapi-net:
    driver: bridge

secrets:
  db_username:
    file: postgres_username.txt
  db_password:
    file: postgres_password.txt
  db_name:
    file: postgres_db_name.txt
  connection_string:
    file: conn_string.txt

volumes:
  db_volume:
...