Задать вопрос
@DenisSosiSka

Как при развёртывании контейнера докер запускать скрипт и копировать созданный им файл в другой образ?

Я пытаюсь написать надстройку над образом swagger-ui, для того чтобы при развёртывании контейнера проходится по указанным адресам других контейнеров и агрегировать их swagger.json в один общий, который затем передавать в swagger-ui.
На данный момент я написал скрипт на C# который успешно агрегирует json, но у меня никак не получается передать его в swagger.
C#:
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Net;
using System.Text;

namespace SwaggerConfigGeneration
{
	internal class Program
	{
		private const string startJSON = @"{
  ""openapi"": ""3.0.1"",
  ""info"": {
    ""title"": ""TestApi"",
    ""version"": ""1.0""
  },
  ""paths"": {";
		private const string endJSON = @"},
  ""components"": { }
}";

		static void Main(string[] args)
		{
			StringBuilder sb = new StringBuilder(
				startJSON);

			var swaggerServises = (Environment
				.GetEnvironmentVariable("SWAGGER_SERVISES") ?? "localhost")
				.Replace(" ", "")
				.Replace("\n", "")
				.Split(',');
			try
			{
				foreach (var servis in swaggerServises)
				{
					var json = GetSwaggerServisJson(servis);

					sb.Append(json["paths"].ToString()[1..^2]);
					sb.Append(',');
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
			sb.Remove(sb.Length-1,1);
			sb.Append(endJSON);
			using (FileStream fstream = new FileStream("swagger.json", FileMode.Create))
			{
				var buf = Encoding.Default.GetBytes(sb.ToString());
				fstream.WriteAsync(buf, 0, buf.Length);
			}
			Console.WriteLine("Произведенно получение данных API");
		}
		private static JObject GetSwaggerServisJson(string swaggerServis)
		{
			using (WebClient wc = new WebClient())
			{
				var json = wc.DownloadString($"http://{swaggerServis}:8080/swagger/v1/swagger.json");
				return JObject.Parse(json);
			}
		}
	}
}

dockerfile:
FROM mcr.microsoft.com/dotnet/runtime:8.0 as builder
WORKDIR /app
ENV SWAGGER_SERVISES = localhost
COPY /bin/Debug/net8.0 /app
RUN dotnet SwaggerConfigGeneration.dll

FROM swaggerapi/swagger-ui
COPY --from=builder /app/swagger.json /app/swagger.json

docker-compose.yml
version: '3'
services:
  swagger:
    image: swagger-config-generation:latest
    container_name: swagger
    environment:
      SWAGGER_SERVISES: ${SWAGGER_SERVISES}
    depends_on:
      - test-app
      - test-app2
    ports:
      - 8081:8080

  test-app:
    image: testapi:latest
    container_name: test-app
    ports: 
      - 8080:8080

  test-app2:
    image: testapi2:latest
    container_name: test-app2
    ports:
      - 8082:8080

.env:
SWAGGER_SERVISES = test-app2, test-app
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Сложный 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы