简体   繁体   English

运行docker Windows映像时无法启动Sonatype Nexus3服务

[英]Cannot start Sonatype Nexus3 service when running docker Windows image

I'm new to docker and I'm trying to get Nexus3 running in a windows container. 我是Docker的新手,正在尝试在Windows容器中运行Nexus3。

My machine is running Windows 10 and I'm using: Docker CE Version 17.03.1-ce-win12 (12058) Channel: stable d1db126 我的机器正在运行Windows 10,正在使用:Docker CE版本17.03.1-ce-win12(12058)通道:稳定的d1db126

I have the following DockerFile content. 我有以下DockerFile内容。

FROM microsoft/nanoserver
#FROM microsoft/windowsservercore     # I also tried this as the base image in case something was missing that I needed.
EXPOSE 8081
ADD /content /nexus3

WORKDIR \\nexus3\\nexus-3.3.1-01-win64\\nexus-3.3.1-01\\bin
RUN ["nexus.exe", "/install", "nexus3"]
RUN ["nexus.exe", "/start", "nexus3"]
RUN ["powershell", "-Command", "Get-Service", "nexus3"]

The content folder tree looks something like this and is just the nexus3 download for windows that is already unzipped. 内容文件夹树看起来像这样,只是已解压缩的Windows的nexus3下载。

B:\Docker\nexus\content
==> tree /A
B:.
\---nexus-3.3.1-01-win64
    +---nexus-3.3.1-01
    |   +---.install4j
    |   +---bin
    |   +---deploy
    |   +---etc
    |   +---jre
    |   +---lib
    |   +---public
    |   \---system
    \---sonatype-work

When the container is build, it says that the service in installed and is started. 构建容器时,它表示已安装该服务并已启动。 I have confirmed this using Get-Service nexus3. 我已经使用Get-Service nexus3确认了这一点。 Here is the build output: 这是构建输出:

B:\docker\nexus
==> docker build -t nexus3 .
Sending build context to Docker daemon   222 MB
Step 1/7 : FROM microsoft/nanoserver
 ---> 6c367cf4cb98
Step 2/7 : EXPOSE 8081
 ---> Running in 047d556668ac
 ---> 6478e2faf841
Removing intermediate container 047d556668ac
Step 3/7 : ADD /content /nexus3
 ---> caacf937e885
Removing intermediate container cb601d94cd4a
Step 4/7 : WORKDIR \\nexus3\\nexus-3.3.1-01-win64\\nexus-3.3.1-01\\bin
 ---> d0e1afd3d105
Removing intermediate container 201e369a32de
Step 5/7 : RUN nexus.exe /install nexus3
 ---> Running in 61516df89010
Installed service 'nexus3'.
 ---> bbfff0f34205
Removing intermediate container 61516df89010
Step 6/7 : RUN nexus.exe /start nexus3
 ---> Running in ff274ef81a91
Service is already running.
 ---> ba20f07a47ce
Removing intermediate container ff274ef81a91
Step 7/7 : RUN powershell -Command Get-Service nexus3
 ---> Running in 3c8c767a56fd

Status   Name               DisplayName
------   ----               -----------
Running  nexus3             nexus3


 ---> ef166720c132
Removing intermediate container 3c8c767a56fd
Successfully built ef166720c132

So far so good. 到现在为止还挺好。 Now I run the image using the following command: 现在,我使用以下命令运行图像:

docker run -it nexus3 powershell

Now using the powershell terminal from inside the container I check to see if the service is running: 现在,从容器内部使用powershell终端,我检查服务是否正在运行:

Get-Service nexus3
Status   Name               DisplayName
------   ----               -----------
Stopped  nexus3             nexus3

So I ran the following but it hates me! 因此,我执行了以下操作,但它讨厌我! ;-) ;-)

Start-Service nexus3

Start-Service : Failed to start service 'nexus3 (nexus3)'.
At line:1 char:1
+ Start-Service nexus3
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service], ServiceCommandException
    + FullyQualifiedErrorId : StartServiceFailed,Microsoft.PowerShell.Commands.StartServiceCommand

Now correct me if i'm wrong here but I should have an administrator powershell inside the container, because of the "docker run -it" switch, therefore this should not be a permissions problem around starting the service. 现在,如果我错了,请更正我,但是由于“ docker run -it”开关,我应该在容器内有一个管理员powershell,因此这应该不是启动服务的权限问题。

I also checked that the service was set to run automatically and it was fine: 我还检查了该服务是否设置为自动运行,并且很好:

==>$(Get-Service nexus3).StartType
Automatic

Does anyone have any idea what I'm doing wrong here? 有人知道我在做什么错吗? The fact that the service starts on a build but fails to start when I run it suggests I'm missing something but I can't figure it out. 该服务在构建时启动,但是在我运行时却无法启动,这一事实表明我缺少了一些东西,但无法弄清楚。

Indeed, user within container should have admin rights, so you might want to check if other things are blocked like port. 实际上,容器内的用户应具有管理员权限,因此您可能要检查是否阻止了其他内容(例如端口)。 I am not familiar with Nexus, but do you know where to find the log dir? 我对Nexus不熟悉,但是您知道在哪里可以找到日志目录吗? It might give you what else is blocking the service. 它可能会给您带来其他阻碍服务的信息。

Also, many companies already start playing with containers on GitHub, so I would usually look for existing image there. 另外,许多公司已经开始在GitHub上使用容器,因此我通常会在GitHub上查找现有映像。

In fact, quick google search showed me this. 实际上,谷歌快速搜索向我展示了这一点。 Maybe, this is what you need? 也许这就是您所需要的?

https://hub.docker.com/r/sonatype/nexus/ https://hub.docker.com/r/sonatype/nexus/

I would change your entry point to: 我会将您的切入点更改为:

nexus.exe /run

Here is the docker file I use to build / run the container. 这是我用来构建/运行容器的docker文件。

One thing to note because Java doesnt like the symlinks docker uses and it tries to go to the actual path when trying to store the blobs and orient db outside the container it blows up. 需要注意的一件事是,Java不喜欢docker使用的符号链接,并且在尝试将blob和db定向到它炸毁的容器之外时会尝试转到实际路径。

To get around this I use a DOS device and set the data path to G: and then I can mount the directory outside the host to backup the orient db and blobs. 为了解决这个问题,我使用DOS设备并将数据路径设置为G :,然后可以将目录挂载到主机外部以备份orient db和blob。

#### Build container
FROM mcr.microsoft.com/windows/nanoserver:sac2016 as installer
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

WORKDIR C:\\nexus
RUN Write-Host "Downloading nexus..."; \
    Invoke-WebRequest "http://download.sonatype.com/nexus/3/latest-win64.zip" -OutFile 'C:\nexus\nexus.zip' -UseBasicParsing

RUN Expand-Archive 'nexus.zip' -DestinationPath 'C:\nexus'
RUN Remove-Item -Path 'C:\nexus\*.zip' -Filter '*.zip' -Force
RUN Get-ChildItem -Path 'C:\nexus' -Filter 'nexus-*' -Directory | Rename-Item -NewName 'nexus_root' -Force
COPY nexus.vmoptions /nexus/nexus_root/bin

#### Runtime Container
FROM mcr.microsoft.com/windows/nanoserver:sac2016
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]

EXPOSE 8081
WORKDIR C:\\nexus
ENTRYPOINT C:\nexus\nexus_root\bin\nexus.exe /run

COPY --from=installer C:\\nexus . 

RUN MKDIR c:\\data
RUN Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices' -Name 'G:' -Value "\??\C:\data" -Type String 

Here is what I use for my nexus.vmoptions: 这是我用于nexus.vmoptions的内容:

-Xms1200M
-Xmx1200M
-XX:MaxDirectMemorySize=2G
-XX:+UnlockDiagnosticVMOptions
-XX:+UnsyncloadClass
-XX:+LogVMOutput
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=g:/data
-Djava.io.tmpdir=g:/tmp
-Dkaraf.startLocalConsole=false
-Dorg.eclipse.jetty.LEVEL=DEBUG

Then I just do the build with 然后我只是用

docker build --tag nexus-img . 

And start it with 然后开始

docker run -d --name nexus --mount type=bind,source=C:\hostdata,target=C:\data -p 80:8081 nexus-img 

And my data and logs end up in C:\\hostdata on the host machine. 我的数据和日志最终存储在主机上的C:\\ hostdata中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM