Я создал пример приложения, чтобы узнать о 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: