我一直在使用Docker for Windows,尝试创建一个可以将cygwin作为容器内的shell运行的Windows容器。我还没有运气好。这是我一直在搞乱的Dockerfile。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_item_menu"
android:layout_width="fill_parent"
android:layout_height="50dip">
<ImageView
android:id="@+id/layout_item_menu_image"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:src="@drawable/menu_image" />
<TextView
android:id="@+id/layout_item_menu_text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignBottom="@id/layout_item_menu_image"
android:layout_marginRight="20dp"
android:text="TEXT 2"
android:textColor="#000000"
android:textSize="18sp" />
<TextView
android:id="@+id/layout_item_menu_text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/layout_item_menu_image"
android:layout_toLeftOf="@id/layout_item_menu_text2"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:text="TEXT 1"
android:textColor="#000000"
android:textSize="18sp" />
</RelativeLayout>
我已经尝试设置ENTRYPOINT和CMD尝试进入cygwin,但似乎都没有做任何事情。我还使用# escape=`
FROM microsoft/windowsservercore
SHELL ["powershell", "-command"]
RUN Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression
RUN choco install cygwin -y
RUN refreshenv
RUN [Environment]::SetEnvironmentVariable('Path', $env:Path + ';C:\tools\cygwin\bin', [EnvironmentVariableTarget]::Machine)
附加到容器并启动了cygwin命令以进入shell,但它似乎没有做任何事情。我没有收到错误,它只是返回到命令提示符,好像什么也没发生。
是否可以在Windows容器中运行另一个shell,或者我只是做错了什么?
谢谢!
答案 0 :(得分:3)
您没有“附加”到docker run
的容器:您使用它启动容器。
在您的情况下,seen here,docker run -it
是正确的做法。
您可以尝试使用c:\cygwin\bin\bash
作为切入点,如in this issue所示。
如issue 32330中所述:
不要误解我的意思,cygwin应该在Docker Windows容器中工作。
但是,在Linux上以容器为模型对容器进行了精心设计,这也是一个有点自相矛盾的事情,只有那些想要在这些新推出的Docker Windows容器中运行Linux-utils的人......
同样的问题仍然没有得到解决,新案例见于2018年5月和6月:
我们有一个可以使用Visual Studio编译的环境,但我们仍然希望使用git和一些从linux获取的非常有用的命令。
我们还使用了使用linux命令的搁置实用程序(例如git-repo)(例如curl,grep,...)某些构建需要Cygwin like ICU (a cross-platform Unicode based globalization library),而最差:我们的构建需要从源代码构建它。
您可以在MSYS2-packages issue 1239中看到崩溃的示例:
Step 5/5 : RUN "C:\\msys64\\usr\\bin\\ls.exe"
---> Running in 5d7867a1f8da
The command 'cmd /S /C "C:\\msys64\\usr\\bin\\ls.exe"' returned a non-zero code: 3221225794
这可以获得有关崩溃的更多信息:
PS C:\msys64\usr\bin>
Get-EventLog -Index 28,29,30 -LogName "Application" | Format-List -Property *
PS > xcopy /S C:\Git C:\Git_Copy
PS > C:\Git_Copy\usr\bin\sh.exe --version > v.txt
PS > type v.txt
如该线程中所述,输出在容器中的某处丢失,从而将其发送到文本文件。
答案 1 :(得分:2)
通过以下两个步骤,我可以预先安装(从主机复制)Cygwin副本,以在基于nanoserver的容器中工作:
我在系统上找到了kernel32.dll的服务器版本,并使用了c:\ windows \ system32上的md5哈希 d8948a7af764f7153b3e396ad44992ff
这也使其他各种可执行文件起作用。请注意,如果没有tty,则使用容器会更加麻烦,并且bash shell不会呈现提示。但是,依靠cygwin组件的脚本(通过Jenkins)可以正常工作。
如果这没有帮助,请尝试this guide,它对我有很大帮助。如果Windows应用程序(cygwin除外)确实缺少DLL,则本指南中的说明会有所帮助。我从未想到SysInternals的procmon.exe可以在主机上运行,并且仍然可以报告容器中的事件!