如何在已停止/未启动的Docker容器中编辑文件
有两种可能性。 1) 直接在主机上编辑文件系统 。这有些危险,并且有可能完全破坏容器,并可能根据发生的问题而破坏其他数据。 2) 将启动脚本更改为 永不失败的内容,例如启动bash,进行修复/编辑,然后将启动程序再次更改为所需的程序(例如节点或之前的版本)。 更多细节: 1)使用
1 2 |
docker ps |
查找正在运行的容器或
1 2 |
docker ps -a |
查找所有容器(包括停止的容器)并
1 2 |
docker inspect (containername) |
查找“ Id”,第一个值之一。 这是包含实现细节的部分,可能会更改,请注意,这样可能会丢失容器。 去
1 2 |
/var/lib/docker/aufs/diff/9bc343a9..(long container id)/ |
在那里您将找到所有更改为容器所基于的图像的文件。您可以覆盖文件,添加或编辑文件。 同样,我不建议这样做。 2)您可以在以下路径找到配置jsonconfig.json
1 2 |
/var/lib/docker/containers/9bc343a99..(long container id)/config.json |
在那里,您可以将参数从“ nodejs app.js”更改为“ / bin / bash”。现在重新启动docker服务并启动容器(您应该看到它现在已正确启动)。你应该用
1 2 |
docker start -i (containername) |
确保它不会立即退出。您现在可以使用容器和/或以后再附加
1 2 |
docker exec -ti (containername) /bin/bash |
另外,docker cp对于复制在容器外部编辑的文件非常有用。 同样,如果容器无论如何或多或少地“丢失”,则应该只使用那些措施,因此任何更改都是一种改进。 参考:http://codingdict.com/questions/53248
View Detailsredis 连接字符串,设置密码
<add name="Abp.Redis.Cache" connectionString="127.0.0.1:6379,password=123456"/> 参考:https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Configuration.md from:https://www.cnblogs.com/lishidefengchen/p/10656327.html
View Details【Docker】解决创建Redis容器没有conf配置文件
序言 这篇文章没有什么知识点,只是为了新伙伴少踩点坑 1. 问题重现 创建容器 2. 解读参数 -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -p: 端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --ip: 为容器制定一个固定的ip --net: 指定网络模式 3. 进入容器查看redis.conf文件 发现是并没有redis.conf文件的,那么这个时候就是新手踩坑阶段了,因为没有系统的学习docker所以会花费很多时间 2. 解决问题 没有配置文件这件事呢!那是因为redis容器里边的配置文件是需要在创建容器时映射进来的 那么就需要删除我们之前创建好的容器,在删除前需要先停止容器后才可以删除 停止容器:docker container stop redis-test 删除容器:docker container rm redis-test 1. 开始重新创建redis容器 docker run -itd --name redis-slave -v /usr/local/redis/redis.conf:/etc/redis.conf -v /root/usr/local/redis/data:/data --net mynetwork -p 6381:6379 --ip 172.10.0.3 redis 参数解释: -v /usr/local/redis/redis.conf:/etc/redis.conf:映射配置文件 -v /root/usr/local/redis/data:/data:映射数据目录 那么这个时候就有redis配置文件了 搭建同意的挂载外部配置 上边是在我宿主机有redis的情况下的,那么下来说宿主机没有redis的情况 这里说的映射其实就是挂载外部配置和数据安装 1. 创建docker统一的外部配置文件 mkdir -p docker/redis/{conf,data} 2. 在conf目录创建redis.conf的配置文件 touch /docker/redis/conf/redis.conf 3. redis.conf文件的内容需要自行去下载,网上很多 4. 创建启动容器,加载配置文件并持久化数据 docker run -d --privileged=true -p 6379:6379 -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data --name redis-test redis redis-server […]
View Detailsdocker安装Redis并设置密码
1.搜索镜像
1 |
docker search redis |
2.拉取镜像
1 |
docker pull redis |
3.创建Redis容器并设置密码
1 2 |
docker run --name redis -d --restart=always --privileged=true -p 6379:6379 redis --requirepass 123456 #前边是宿主机端口 后面是docker使用的端口 |
4.备注 为现有的redis创建密码或修改密码的方法: 1.进入redis的容器 docker exec -it 容器ID bash 2.进入redis目录 /usr/local/bin 3.运行命令:redis-cli 4.查看现有的redis密码:config get requirepass 5.设置redis密码config set requirepass ****(****为你要设置的密码) 6.若出现(error) NOAUTH Authentication required.错误,则使用 auth 密码 来认证密码 from:https://www.cnblogs.com/zhangzimo/p/12753563.html
View Detailswebapi 统一处理时间格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class UnixDateTimeConvertor : DateTimeConverterBase { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return DateTime.Parse(reader.Value.ToString()); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { //System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); //long timeStamp = (long)(((DateTime)value) - startTime).TotalMilliseconds; writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss")); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 //GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter //{ // DateTimeFormat = "yyyy-MM-dd HH:mm:ss" //}); // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); //设置Datetime 到 時間戳 的互轉 JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings() { Formatting = Formatting.Indented, DateTimeZoneHandling = DateTimeZoneHandling.Local }; jSettings.Converters.Add(new UnixDateTimeConvertor()); config.Formatters.JsonFormatter.SerializerSettings = jSettings; } } |
from:https://www.cnblogs.com/liuqiyun/p/10729338.html
View Details.net core web api部署到docker
一、创建.net core web api 的Demo 修改部分代码 端口随意指定,ip用星号“*”,方便接下来docker虚拟网络自动分配ip 下一步是Dockerfile文件,如果发现你的项目中没有此文件,很简单,右键项目=》添加=》Docker支持即可,然后修改文件如下图 然后发布项目并上传文件到服务器 二、将api项目部署到docker中 首先,进入到你上传的文件目录 根据目录下的Dockerfile创建镜像:docker build -t dockerapitestimage . (注意,注意,注意后面有一个点“.”,看清楚了,这个点表示当前目录上下文) 如果你在这一步失败了,请先尝试在docker下拉取dotnet镜像,执行命令 docker pull dotnet:latest ,拉取完之后再创建api镜像 这里要下载好几百兆的镜像包,网速太慢的话,建议尝试阿里云镜像加速,具体见我另外一篇文章 docker使用阿里云镜像加速 镜像创建成功后,我们就可以来创建容器并使用啦,继续往下 可以看到服务已经成功启动了,接下来准备访问一下试试 在linux中,首先我们输入$ docker ps 看下详情,如下图 发现我们的dockerapitest容器的ip地址是 0.0.0.0:8001,接着在linux中访问看看,成功了 linux下都没问题了,然后我们回windows下看看,如下图,显然成功了。 from:https://www.cnblogs.com/luoocean/p/11100684.html
View Details.Net Core WebApi 模型验证无效时报400
问题 模型验证无效时,没有进入到接口里,而是直接报400 Bad Request,非常不友好。 环境 SDK:.Net Core 2.2.401 开发工具:VS2017 step 1 创建接口
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// 注册 /// </summary> /// <param name="input">request Body</param> [HttpPost] [AllowAnonymous] public object PostRegister([FromBody] InputUserRegister input) { var userService = GetService<IUserService>(); return userService.Register(input); } |
Step 2 创建模型 引用命名空间
1 |
using System.ComponentModel.DataAnnotations; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class InputUserRegister { [Required(ErrorMessage = "请填写用户名")] [StringLength(20, ErrorMessage = "用户名长度过长")] public string UserName { get; set; } [Required(ErrorMessage = "请填写密码")] [StringLength(20, ErrorMessage = "密码长度过长")] public string Password { get; set; } [Required(ErrorMessage = "请填写确认密码")] [Compare("Password", ErrorMessage = "两次输入的密码不一致")] public string ConfirmPassword { get; set; } } |
Step 3 测试 解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#region 禁止默认行为 services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = (context) => { if (context.ModelState.IsValid) return null; var error = ""; foreach (var item in context.ModelState) { var state = item.Value; var message = state.Errors.FirstOrDefault(p => !string.IsNullOrWhiteSpace(p.ErrorMessage))?.ErrorMessage; if (string.IsNullOrWhiteSpace(message)) { message = state.Errors.FirstOrDefault(o => o.Exception != null)?.Exception.Message; } if (string.IsNullOrWhiteSpace(message)) continue; error = message; break; } return new JsonResult(new Models.VModels.ErrorResponse(error.ToString())); }; }); #endregion |
from:https://www.cnblogs.com/EminemJK/p/11498852.html
View Details第6章 数据注解 System.ComponentModel.DataAnnotations 、注解后台原理、自定义验证ValidationAttribute、IValidatableObject
客户端验证对用户向表单中输入的数据给出一个即时反馈。 服务器验证,主要是因为来自网络的信息都是不能信任的。 一、 为验证注解订单 1 、验证注解的使用,自定义错误提示消息 数据注解特性定义在 System.ComponentModel.DataAnnotations 中(但有一个特性不在这个命名空间),它提供了服务器端验证,当模型属性上使用这些特性时,框架也支持客户端验证。在命名空间DataAnnotations中,有4个特性可以用来应对一般验证场合。 (1)、字符非空,最大长度,值范围,两个属性相同,正则表达式 //字段非空,最大长度160 [Required(ErrorMessage="FirstName不能为空")] [StringLength(160, ErrorMessage = "FirstName太长了")] public string FirstName { get; set; } //正则表达式验证必须是电子邮件 [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage="邮件地址不正确")] public string Email { get; set; } //字段非空,数值类型最小值,最大值 [Required] [Range(typeof(decimal), "0.00", "49.99")] public decimal Total { get; set; } //对象两个属性拥有相同的值 [Compare("Email")] public string EmailConfirm { get; set; } […]
View Detailswebapi 获取json数据
一般的我们可以直接使用参数来接受,这个就不多介绍了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[HttpGet] public IHttpActionResult Test2([FromUri]string name) { object obj = new { name = "sss", age = 78, sex = true }; return Ok(new { errcode = 0, data = obj }); } [HttpPost] public IHttpActionResult Test3([FromBody]string name) { throw new Exception("嘻嘻嘻"); } /// <summary> /// 返回强类型 /// </summary> /// <param name="name"></param> /// <returns></returns> [HttpGet] public CommonOutDto Test4([FromUri]string name) { CommonOutDto outDto = new CommonOutDto(); outDto.errcode = 0; return outDto; } |
现在一般使用json来传递参数,如果使用强类型,需要我们把类的属性和参数名设置一样就可以了。get,post都可以,这里只演示了post请求 ①使用参数名来接受,这样显示不管你是传递json字符串还是json对象都是接收不到的
1 2 3 4 5 |
[HttpPost] public IHttpActionResult Test4([FromBody]string json) { throw new Exception("嘻嘻嘻"); } |
②稍微改动下,把参数类型换成objct,这样我们不管是传递json对象和字符串都是能够接受到的
1 2 3 4 5 |
[HttpPost] public IHttpActionResult Test4([FromBody]object json) { throw new Exception("嘻嘻嘻"); } |
json对象; json字符串: 正解:普通的两种使用方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/// <summary> /// 如果没有定义Dto类型 /// </summary> /// <param name="json">json数据</param> /// <returns></returns> [HttpPost] public IHttpActionResult Test3([FromBody]object json) { JObject @object = JObject.Parse(json.ToString()); return Ok(@object); } /// <summary> /// 定义了Dto类型 /// </summary> /// <param name="inDto"> /// 根据json 定义的类 /// </param> /// <returns></returns> [HttpPost] public IHttpActionResult Test4(ToiletInfoInDto inDto) { // CommonOutDto 为自定义的返回类 CommonOutDto outDto = new CommonOutDto(); outDto.dataStr = "请求成功"; outDto.errcode = 0; return Ok(outDto); } |
1 |
ToiletInfoInDto : |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/// <summary> /// 厕所信息 /// </summary> public class ToiletInfoInDto { /// <summary> /// 厕所编号 /// </summary> public string CsNum { get; set; } /// <summary> /// 厕所名称 /// </summary> public string CsName { get; set; } /// <summary> /// 百度经度 /// </summary> public string CoordX { get; set; } /// <summary> /// 百度纬度 /// </summary> public string CoordY { get; set; } /// <summary> /// 厕所等级 /// </summary> public string Rank { get; set; } } |
1 |
CommonOutDto: |
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// 返回公共类 /// </summary> public class CommonOutDto { public int errcode { get; set; } public string dataStr { get; set; } public string errmsgStr { get; set; } } |
③mvc中也可以写接口,我们肯定使用过流接受过参数,那webapi中同样是可以的 mvc中可以直接写:
1 |
string json2 = new StreamReader(Request.InputStream).ReadToEnd(); |
webapi中没有 HttpContext这个,我们可以引用进行使用
1 2 |
//引用 using System.Web; string json2 = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd(); |
webapi中我们使用request强制同步获取数据,显示获取不到
1 2 |
//强制同步获取不到数据 string aa = this.Request.Content.ReadAsStringAsync().GetAwaiter().GetResult(); |
推荐:使用异步的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/// <summary> /// 使用objct接受 /// </summary> /// <param name="json"></param> /// <returns></returns> [HttpPost] public async Task<IHttpActionResult> TestAsync([FromBody]object json) { JObject @object = JObject.Parse(json.ToString()); return await Task.FromResult<IHttpActionResult>(Ok(@object)); } /// <summary> /// 使用强类型接受 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IHttpActionResult> TestAsync2(ToiletInfoInDto inDto) { return await Task.FromResult<IHttpActionResult>(Ok(inDto)); } /// <summary> /// 使用读取数据的方式 /// </summary> /// <returns></returns> [HttpPost] public async Task<IHttpActionResult> TestAsync3() { string aa = await this.Request.Content.ReadAsStringAsync(); return await Task.FromResult<IHttpActionResult>(Ok(aa)); } /// <summary> /// 使用强类型接受,返回强类型 推荐这种,输入,输出都新建一个对应的Dto进行处理 /// </summary> /// <param name="inDto">输入类</param> /// <returns>输出类</returns> [HttpPost] public async Task<CommonOutDto> TestAsync4(ToiletInfoInDto inDto) { CommonOutDto outDto = new CommonOutDto(); outDto.errcode = 0; return await Task.FromResult(outDto); } |
显示结果:
1 |
可以看到我们的 TestAsync2 接口中,我们的属性小写了,这是自己序列化json数据造成的,俗称:驼峰式。 当然这个是可以设置的,我们在webapiConfig.cs 中可以设置我们的json的属性 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); //多添加一个action config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); // 干掉XML序列化器 两种都可以 //GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); config.Formatters.Remove(config.Formatters.XmlFormatter); //配置json数据格式 JsonMediaTypeFormatter jsonFormatter = config.Formatters.JsonFormatter; //忽略循环引用,如果设置为Error,则遇到循环引用的时候报错(建议设置为Error,这样更规范) jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Error; //日期格式化,默认的格式也不好看 jsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出 jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver(); //json中属性开头字母小写的驼峰命名 //jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); } } |
总结: 1:一般的我们使用Object类型或者强类型来接接收 2:提高效率,我们是异步 题外:我们一般都会准备一个Dto来接受我们的json对象,如果你不想这样写,也可以使用JObject来用。 from:https://www.cnblogs.com/Sea1ee/p/10438838.html
View DetailsASP.NET Core 的 Docker 映像
本教程演示如何在 Docker 容器中运行 ASP.NET Core 应用。 在本教程中,你将了解: 了解 Microsoft.NET 核心 Docker 映像 下载 ASP.NET Core 示例应用 本地运行示例应用 在 Linux 容器中运行示例应用 在 Windows 容器中运行示例应用 手动生成和部署 ASP.NET Core Docker 映像 在本教程中,你下载 ASP.NET Core 示例应用并在 Docker 容器中运行它。 此示例适用于 Linux 和 Windows 容器。 示例 Dockerfile 使用 Docker 多阶段构建功能在不同的容器中生成和运行。 生成和运行容器是由 Microsoft 从 Docker 中心提供的映像中创建的: dotnet/core/sdk 此示例将此映像用于生成应用。 此映像包含带有命令行工具 (CLI) 的 .NET Core SDK。 此映像对本地开发、调试和单元测试进行了优化。 为开发和编译而安装的工具使其成为一个相对较大的映像。 dotnet/core/aspnet 此示例将此映像用于运行应用。 此映像包含 ASP.NET Core 运行时和库,并针对在生产中运行应用进行了优化。 此映像专为部署和应用启动的速度而设计,相对较小,因此优化了从 Docker 注册表到 Docker 主机的网络性能。 仅将运行应用所需的二进制文件和内容复制到容器。 已准备运行内容,以此实现从 Docker run 到应用启动的最快时间。 Docker 模型中不需要动态代码编译。 先决条件 .NET Core SDK 3.0 Docker 客户端 18.03 或更高版本 Linux 分布 CentOS Debian Fedora Ubuntu macOS Windows Git 下载示例应用 通过克隆 .NET Core Docker 存储库下载示例: 控制台复制 […]
View Details