无法在Windows Docker Container中运行cygwin

时间:2017-03-30 16:48:08

标签: windows shell docker cygwin

我一直在使用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,或者我只是做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

您没有“附加”到docker run的容器:您使用它启动容器。

在您的情况下,seen heredocker 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 *

The workaround是:

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的容器中工作:

  1. 在docker run cmd-line中(在交互式运行docker时)使用Żubrówka对 no -t 的建议
  2. 将主机(Windows Server 2016) kernel32.dll 复制到容器的c:\ windows \ system32

我在系统上找到了kernel32.dll的服务器版本,并使用了c:\ windows \ system32上的md5哈希 d8948a7af764f7153b3e396ad44992ff

这也使其他各种可执行文件起作用。请注意,如果没有tty,则使用容器会更加麻烦,并且bash shell不会呈现提示。但是,依靠cygwin组件的脚本(通过Jenkins)可以正常工作。

如果这没有帮助,请尝试this guide,它对我有很大帮助。如果Windows应用程序(cygwin除外)确实缺少DLL,则本指南中的说明会有所帮助。我从未想到SysInternals的procmon.exe可以在主机上运行,​​并且仍然可以报告容器中的事件!