예제 #1
0
        public async Task <ActionResult <StandardResponse> > CopyContainer(Post post)
        {
            // Assume the username of post is the user who want to copy the container
            // NOT THE AURTHOR
            string ipAddress = gRpcClient.getServerIp(new ServerRequest()
            {
                ContainerId = post.ContainerId.ToString()
            }).Ip;

            if (ipAddress.Length == 0)
            {
                return(NotFound());
            }
            Container container = await _context.Container.FindAsync(post.ContainerId);

            Container newContainer = new Container()
            {
                Username      = post.Username,
                ContainerName = container.ContainerName,
                CreateTime    = DateTime.Now,
                Type          = container.Type
            };
            await _context.AddAsync(newContainer);

            await _context.SaveChangesAsync();

            CopyContainerDto dto = new CopyContainerDto()
            {
                ContainerId = newContainer.ContainerId,
                ImageId     = post.PostId
            };
            var dtoJSON = new StringContent(
                System.Text.Json.JsonSerializer.Serialize(dto, new JsonSerializerOptions()),
                Encoding.UTF8,
                "application/json");

            using var httpResponse = await _factory.CreateClient()
                                     .PostAsync("http://" + ipAddress + ":13000/api/docker/Import", dtoJSON);

            if (httpResponse.IsSuccessStatusCode)
            {
                return(NewResponse(200, "复制成功", null));
            }
            else
            {
                return(NewResponse(200, "复制失败", null));
            }
        }
예제 #2
0
        public async Task <ActionResult <StandardResponse> > Import(CopyContainerDto dto)
        {
            string startString = "mlab" + dto.ContainerId;
            var    imageList   = await client.Images.ListImagesAsync(new ImagesListParameters());

            string imageId = "";

            foreach (var image in imageList)
            {
                if (image.RepoTags[0].StartsWith(dto.ImageId.ToString()))
                {
                    imageId = image.ID;
                    break;
                }
            }
            if (imageId == "")
            {
                return(NotFound());
            }
            string mHostPort = (20000 + dto.ContainerId).ToString();
            var    result    = await client.Containers.CreateContainerAsync(new Docker.DotNet.Models.CreateContainerParameters()
            {
                Image        = imageId,
                Name         = "mlab" + dto.ContainerId.ToString(),
                ExposedPorts = new Dictionary <string, EmptyStruct>()
                {
                    { "8888", new EmptyStruct() }
                },
                HostConfig = new HostConfig
                {
                    PortBindings = new Dictionary <string, IList <PortBinding> > {
                        {
                            "8888", new List <PortBinding> {
                                new PortBinding {
                                    HostPort = mHostPort
                                }
                            }
                        }
                    }
                }
            });

            await cSRedisClient2.SetAsync(dto.ContainerId.ToString(), "127.0.0.1");

            await cSRedisClient.SetAsync(dto.ContainerId.ToString(), mHostPort);

            return(NewResponse(200, "success", null));
        }