修复Docker下的问题。看来,GIT与它有什么关系?



Windows下的Docker是一个持续的冒险。然后,他需要更新操作系统,否则未安装最新版本,然后他忘记了如何连接到网络。一般来说,每天都会有来自他的新闻。 “设置并忘记”与Windows的Docker桌面无关。特别是在未完全按照开发人员的建议使用时。并且由于某些原因,他们不赞成将外部窗口作为本地连接到网络驱动器。并且他们不同意访问也位于主机上的网络文件夹。他们写道,从安全角度来看,这是恐怖的,他们需要各种密钥,例如: 使mount命令在容器中工作,等等。

cap_add:
- SYS_ADMIN
- DAC_READ_SEARCH




通常,当容器再次上传到客户的服务器后,这些服务不再能看到网络驱动器时,我并不感到特别惊讶。这已经发生,甚至为支持小组编写了分步说明,说明了在docker网络设置中断时如何以及如何重启。

因此,我打开说明并采取行动。重新启动容器没有帮助。我通过docker-compose重新启动并重新构建了基础架构-并没有帮助。我将Docker设置重置为出厂设置,还原了虚拟机的设置,重新加载了映像,并通过docker-compose运行-再次,一切都和以前一样-它看不到网络。更准确地说,尽管从容器到SMB服务器的ping操作是正常的,但它不会连接到网络设备。最后一点是重启服务器并重新安装Docker,而我跳过了,因为我真的不想重启服务器。在此指令结束。

好的,我要搬到我的家用计算机上,这里也有适用于Windows的Docker,但版本稍新。我检查一下。相同的鸡蛋:

没有连接,但请稍等!

是的好吧,真的,我认为Docker通过某种安全性汇总了此更新,现在我的脚本因此无法启动?最后检查是从计算机上完全删除Docker,然后重新安装。这应该比重置为出厂设置要凉。我正在做上一步的整个列表,除了此以外,我还重新启动了汽车,以至于完全具有讽刺意味。我从头开始安装Docker,上传图片,启动docker-compose-eprst!所有服务都没有看到网络球,而是在加载时继续写“ mount error(22):Invalid parameter”。

我尝试从命令行逐行运行脚本:我连接到容器,依次运行命令,看到一切都可以正常工作需要:

mkdir -p $SMB_MOUNT_POINT
mount -t cifs $SMB_SHARE $SMB_MOUNT_POINT -o user=$SMB_USER,password=$SMB_PASSWORD,vers=2.0
ls $SMB_MOUNT_POINT

也就是说,这是什么,在容器启动时带有一些将参数传递给脚本的废话?

我们正在寻找更多的想法。 docker重新启动的所有选项都很浅,在父映像中有可能更改的选项。我的映像基于openjdk:8-jdk-alpine构建,未指定特定版本,因此任何安全性改进都可能破坏我的脚本。也许他们在OpenJDK或Alpine的子公司中进行了更改?

我检查了项目日志,尝试选择较旧的openjdk:8-jdk-alpine-3.8,openjdk:8-jdk-alpine-3.7等。 -每次我重建容器时,都要检查-一切都和以前一样。

该死的!也许我仍然更改了装配体中的某些内容?一个月前从GIT'a版本的项目中卸载,收集-同样的故障。三个月前-问题仍然存在。为何如此?发生了什么变化?当前保证docker配置可以正常工作,映像配置也没有更改,项目源相同(GIT保存所有内容)。没有奇迹-您仍然需要了解这些变化在何处出现。在产品中,我手动启动了对球的连接命令-因此,直到重新启动服务才能正常工作并进入睡眠状态。早上比晚上更明智。

没有连接,但请稍等!

第二天早上,这个想法就来了-可能是时候找出答案了,脚本执行时到底不喜欢什么。

消息“安装错误(22):无效的参数”不是很有用。我发现bash有一个魔术键,在执行脚本时它会显示调试信息。

在sh中开始调试:

/ # sh -x /entry-point.sh
' echo 'Mount //<private_ip>/Exchange/Pipeline to /pipeline
Mount //<private_ip>/Exchange/Pipeline to /pipeline
' mkdir -p '/pipeline
' mount -t cifs //<private_ip>/Exchange/Pipeline /pipeline -o 'user=<private_user>,password=<private_password>,vers=2.0
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount: mounting //<private_ip>/Exchange/Pipeline on /pipeline failed: Invalid argument
' ls '/pipeline
+ exec

在这里出现了一些奇怪的时刻-该行以引号开头,然后在引号结尾...引号来自哪里?

想法-使用真实的bash进行发布是否可以提供更多信息?

在BASH容器中安装:

apk add bash

我开始调试:

/ # bash -x /entry-point.sh
' echo 'Mount //<private_ip>/Exchange/Pipeline to /pipeline
Mount //<private_ip>/Exchange/Pipeline to /pipeline
+ mkdir -p $'/pipeline\r'
+ mount -t cifs //<private_ip>/Exchange/Pipeline /pipeline -o $'user=<private_user>,password=<private_password>,vers=2.0\r'
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount: mounting //<private_ip>/Exchange/Pipeline on /pipeline failed: Invalid argument
+ ls $'/pipeline\r'
+ exec

该死的,好像该行以加号开头-很好,但是出现了\ r$'...'参数,

我们将Midnight Commander设置为试验设备apk add mc并打开脚本进行编辑,然后:



Oppa!每行末尾的^M。好吧,好吧,看一下本地项目-行尾如何? CRLF。但是,我们在Windows下工作。

将此特定的CRLF文件更改为LF(记事本++!),收集项目-Bingo!它可以正常工作。

为什么以前还可以,但是现在一切都飞起来了?我看一下提交-没有变化。然后我记得GIT可以即时编辑换行文本文件。前几天,我连接了一个新的存储库,并可能从那里上传了所有文件,并转换为CRLF。

结果,我们将.gitattributes文件添加到项目中,表明在单独的文件中,必须像UNIX中一样保存行尾字符:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Declare files that will always have LF line endings on checkout.
*.sh text eol=lf

道德-有时,罪魁祸首甚至没有落入最初的犯罪嫌疑人圈子。

压力


在更新到适用于Windows 2.2.0.3的最新版本的Docker桌面后,一切都停止了工作。这次,我立即进入了容器,并开始调试。事实证明,用于访问主机的10.0.75.1 IP地址停止工作,现在已从系统中删除DockerNat,并且DockerDesktopVM虚拟机甚至没有外部网络适配器,即 与之通信不是通过标准网络,而是有所不同。要访问主机,必须使用host.docker.internal其他开发人员和写的
DockerNAT已从Docker Desktop 2.2.0.0中删除,因为不支持使用IP地址从主机到容器进行通信。要从容器与主机进行通信,必须使用特殊的DNS名称host.docker.internal。

好的,我修复了测试环境的配置,拾取了数据库,从容器ping到host.docker.internal通过,但未连接网络驱动器。我尝试从外壳程序手动运行mount,然后得到熟悉的错误“ mount error(22):Invalid arguments”。

我依次删除了参数-我只运行“ mount -t cifs //host.docker.internal/playground / pipeline” -似乎可以正常运行,但已被root用户删除

添加用户:mount -t cifs //host.docker.internal/playground/pipeline -o user = smbuser-要求输入密码并连接!

完整版也可以使用:

mount -t cifs //host.docker.internal/playground /pipeline -o user=smbuser,password=smbpassword

但是“ mount -t cifs //host.docker.internal/playground/pipeline -o user = smbuser,密码= smbpassword,vers = 2.0 ”不会耕作。

我将最后一个参数更改为vers = 2.1-干杯,它起作用了!

似乎最新版本的Docker自己实现了带有二十一点的SMB服务器,但没有2.0支持。当然,胡说八道与其他新闻相比。

所有的善良,力量和毅力!

本文的插图取自blog.eduonix.com/software-development/learn-debug-docker-containers

All Articles