Посмотрите на официальное изображение dog postgresql
У него такой рабочий процесс:
Итак, вам нужно изменить ваш Dockerfile следующим образом:
COPY ./docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
USER postgres
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]
И затем изменить ваш docker-entrypoint.sh следующим образом:
#!/bin/sh
# Before PostgreSQL can function correctly, the database cluster must be initialized:
initdb -D /var/lib/postgres/data
# internal start of server in order to allow set-up using psql-client
# does not listen on external TCP/IP and waits until start finishes
pg_ctl -D "/var/lib/postgres/data" -o "-c listen_addresses=''" -w start
# create a user or role
psql -d postgres -c "CREATE USER someuser WITH PASSWORD 'jkhkjah';"
# create database
psql -v ON_ERROR_STOP=1 -d postgres -c "CREATE DATABASE dockertest OWNER 'someuser';"
# stop internal postgres server
pg_ctl -v ON_ERROR_STOP=1 -D "/var/lib/postgres/data" -m fast -w stop
exec "$@"
Я думаю, что ваша главная ошибка - запуск postgresql в фоновом режиме
/usr/bin/postgres -D /var/lib/postgres/data &
и немедленное выполнение запросов до запуска сервера.
Также я рекомендую добавить -v ON_ERROR_STOP=1
параметры в psql, чтобы увидеть подробную информацию и остановить процесс в случае ошибки
Нет. На самом деле это не обязательно совместимые массивы.
[,]
определяет многомерный массив. List<List<T>>
соответствовал бы больше зубчатому массиву ( object[][]
).
Проблема состоит в том что, с Вашим исходным объектом, каждым List<object>
содержавшийся в списке списков может иметь другое количество объектов. Необходимо было бы сделать многомерный массив из самой большой длины внутреннего списка и клавиатуру с нулевыми значениями или чем-то вдоль тех строк, чтобы заставить его соответствовать.
Вы не собираетесь получать очень простое решение для этого (т.е. несколько строк). LINQ/the Enumerable
класс не собирается помогать Вам в этом случае (хотя он мог, если бы Вы хотели зубчатый массив, т.е. Object[][]
). Вложенное повторение плоскости является, вероятно, лучшим решением в этом случае.
public static T[,] To2dArray(this List<List<T>> list)
{
if (list.Count == 0 || list[0].Count == 0)
throw new ArgumentException("The list must have non-zero dimensions.");
var result = new T[list.Count, list[0].Count];
for(int i = 0; i < list.Count; i++)
{
for(int j = 0; j < list[i].Count; j++)
{
if (list[i].Count != list[0].Count)
throw new InvalidOperationException("The list cannot contain elements (lists) of different sizes.");
result[i, j] = list[i][j];
}
}
return result;
}
Я включал немного обработки ошибок в функцию просто, потому что она могла бы вызвать некоторые запутывающие ошибки при использовании ее во вложенном списке неквадрата.
Этот метод, конечно, предполагает что каждый List<T>
содержавший как элемент родителя List
имеет ту же длину. (Иначе действительно необходимо использовать зубчатый массив.)
Грубо говоря, ответ не, не легко.
Возможно, требуется отредактировать вопрос дать нам больше фона о том, почему эти объявления необходимы, и мы можем помочь Вам с Вашей корневой проблемой?
Я предполагаю, что Вы не можете изменить функцию, в которую необходимо передать это.
Я не вижу, почему Вы не можете просто использовать object[,]
для начала. Это - моя рекомендация.
Я сомневаюсь, что это поможет Вам в Вашей ситуации, но она могла бы сделать часть массива, работающего легче над Вами запуститься с. Вы знаете о .ToArray()
метод на a List
?