简体   繁体   中英

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.

My machine is running Windows 10 and I'm using: Docker CE Version 17.03.1-ce-win12 (12058) Channel: stable d1db126

I have the following DockerFile content.

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.

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. 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:

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.

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? 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.

In fact, quick google search showed me this. Maybe, this is what you need?

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.

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.

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.

#### 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:

-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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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