2

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.

4

2 回答 2

0

实际上,容器内的用户应该具有管理员权限,因此您可能需要检查其他东西是否被阻止,例如端口。我不熟悉 Nexus,但你知道在哪里可以找到日志目录吗?它可能会为您提供阻止服务的其他内容。

此外,许多公司已经开始在 GitHub 上使用容器,所以我通常会在那里寻找现有的图像。

事实上,快速谷歌搜索向我展示了这一点。也许,这就是你需要的?

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

于 2017-05-22T17:08:56.300 回答
0

我会将您的入口点更改为:

nexus.exe /run

这是我用来构建/运行容器的 docker 文件。

需要注意的一件事是,Java 不喜欢 docker 使用的符号链接,并且在尝试存储 blob 并将 db 定向到它爆炸的容器之外时,它会尝试转到实际路径。

为了解决这个问题,我使用 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 

这是我用于 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

然后我只是用

docker build --tag nexus-img . 

然后开始

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

我的数据和日志最终在主机上的 C:\hostdata 中。

于 2019-03-28T19:45:24.613 回答