EPERM在Azure管道上构建Windows node.js Docker映像时出错



我正试图在Windows Server上的Docker容器中运行node.js应用程序。我对服务器的控制有限。最值得注意的是,服务器没有Hyper-V可用,所以(我相信(我需要一个基于Windows的Docker映像。我有一个Dockerfile,我可以在本地成功构建,但当我试图在Azure管道中构建所有内容时,我遇到了一个错误:

Error: EPERM: operation not permitted, open 'C:apppackage-lock.json'

我已经(用RUN dir(验证了文件已成功复制。

编辑如果我不通过package-lock.json进行复制,管道在Azure和本地都可以工作

同样值得注意的是(也许(,在管道输出的最开始还有另一个错误:

"C:Program FilesDockerdocker.exe" pull "=installer c:nodenodejs ."
invalid reference format
"C:Program FilesDockerdocker.exe" inspect "=installer c:nodenodejs ."
Error: No such object: =installer c:nodenodejs .

尽管这可能并不相关,因为它似乎是从构建图像开始的。

Dockerfile

# escape=`
FROM mcr.microsoft.com/powershell:lts-nanoserver-1809 as installer
ARG NODE=16.3.0
RUN mkdir -p C:node
WORKDIR C:node
SHELL ["pwsh.exe", "-command", "$ErrorActionPreference = 'Stop';$ProgressPreference='silentlyContinue';"]
RUN Invoke-WebRequest -Uri https://nodejs.org/dist/v$env:NODE/node-v$env:NODE-win-x64.zip -OutFile nodejsZip.zip -UseBasicParsing `
&& Expand-Archive nodejsZip.zip -DestinationPath .`
&& Rename-Item node-v$env:NODE-win-x64 nodejs
FROM mcr.microsoft.com/windows/nanoserver:1809
WORKDIR C:nodejs
COPY --from=installer C:nodenodejs .
ENV PATH="$WindowsPATH;C:/nodejs"
RUN npm config set registry https://registry.npmjs.org/
ENV NODE_ENV=production
WORKDIR /app
# install and cache app dependencies
COPY package.json package-lock.json* npm-shrinkwrap.json* .npmrc .
RUN dir
RUN npm install --production && move node_modules ..
COPY . .
EXPOSE 8080
CMD ["npm", "start"]

管道步骤

- task: Docker@2
displayName: Build and push Docker image
inputs:
command: buildAndPush
repository: ***
dockerfile: $(appDirectory)Dockerfile
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(Build.BuildId)

管道输出

Starting: Build and push Docker image
==============================================================================
Task         : Docker
Description  : Build or push Docker images, login or logout, start or stop containers, or run a Docker command
Version      : 2.187.0
Author       : Microsoft Corporation
Help         : https://aka.ms/azpipes-docker-tsg
==============================================================================
"C:Program FilesDockerdocker.exe" pull "=installer c:nodenodejs ."
invalid reference format
"C:Program FilesDockerdocker.exe" inspect "=installer c:nodenodejs ."
Error: No such object: =installer c:nodenodejs .
[]
"C:Program FilesDockerdocker.exe" build -f D:a1sAppDockerfile [bunch of labels with revealing names] -t ***/[appName]:1610 -t ***/[appName]:latest -t ***/[appName]:1.1.0 D:a1sApp
Sending build context to Docker daemon  156.5MB
Step 1/30 : FROM mcr.microsoft.com/powershell:lts-nanoserver-1809 as installer
lts-nanoserver-1809: Pulling from powershell
b9043d31610e: Already exists
9385842e37a1: Pulling fs layer
1785b1708bde: Pulling fs layer
8bbda5f0e88c: Pulling fs layer
69aef7d2d307: Pulling fs layer
ce716bfd5dfd: Pulling fs layer
01ded93fffb2: Pulling fs layer
54121c5fa6ac: Pulling fs layer
3f8033467b82: Pulling fs layer
9e9e60715d2d: Pulling fs layer
69aef7d2d307: Waiting
ce716bfd5dfd: Waiting
01ded93fffb2: Waiting
54121c5fa6ac: Waiting
3f8033467b82: Waiting
9e9e60715d2d: Waiting
8bbda5f0e88c: Verifying Checksum
8bbda5f0e88c: Download complete
1785b1708bde: Verifying Checksum
1785b1708bde: Download complete
9385842e37a1: Verifying Checksum
ce716bfd5dfd: Verifying Checksum
ce716bfd5dfd: Download complete
69aef7d2d307: Verifying Checksum
69aef7d2d307: Download complete
54121c5fa6ac: Verifying Checksum
54121c5fa6ac: Download complete
3f8033467b82: Verifying Checksum
3f8033467b82: Download complete
9385842e37a1: Pull complete
9e9e60715d2d: Verifying Checksum
9e9e60715d2d: Download complete
1785b1708bde: Pull complete
8bbda5f0e88c: Pull complete
69aef7d2d307: Pull complete
ce716bfd5dfd: Pull complete
01ded93fffb2: Verifying Checksum
01ded93fffb2: Download complete
01ded93fffb2: Pull complete
54121c5fa6ac: Pull complete
3f8033467b82: Pull complete
9e9e60715d2d: Pull complete
Digest: sha256:2742181d6096061fa10b0b0ef34a00a634e7361f4948f4d71d99df052a08da64
Status: Downloaded newer image for mcr.microsoft.com/powershell:lts-nanoserver-1809
---> 4375ea1bb0a3
Step 2/30 : ARG NODE=16.3.0
---> Running in a129a7c48527
Removing intermediate container a129a7c48527
---> 6b07c85950b7
Step 3/30 : RUN mkdir -p C:node
---> Running in 09f84ee6dbc8
Removing intermediate container 09f84ee6dbc8
---> 3400da58010d
Step 4/30 : WORKDIR C:node
---> Running in 3406bcfdbc3e
Removing intermediate container 3406bcfdbc3e
---> 1957d042581a
Step 5/30 : SHELL ["pwsh.exe", "-command", "$ErrorActionPreference = 'Stop';$ProgressPreference='silentlyContinue';"]
---> Running in cb32ef99f0ec
Removing intermediate container cb32ef99f0ec
---> a39d5e0ae00e
Step 6/30 : RUN Invoke-WebRequest -Uri https://nodejs.org/dist/v$env:NODE/node-v$env:NODE-win-x64.zip -OutFile nodejsZip.zip -UseBasicParsing     && Expand-Archive nodejsZip.zip -DestinationPath .    && Rename-Item node-v$env:NODE-win-x64 nodejs
---> Running in f693e5889205
Removing intermediate container f693e5889205
---> 88ac85fc56b9
Step 7/30 : FROM mcr.microsoft.com/windows/nanoserver:1809
---> ad675c9cb2d5
Step 8/30 : WORKDIR C:nodejs
---> Running in 07e5c75044bb
Removing intermediate container 07e5c75044bb
---> 985de76e022c
Step 9/30 : COPY --from=installer C:nodenodejs .
---> 614424adca70
Step 10/30 : ENV PATH="$WindowsPATH;C:/nodejs"
---> Running in 54c7d7063723
Removing intermediate container 54c7d7063723
---> 06f449a12162
Step 11/30 : RUN npm config set registry https://registry.npmjs.org/
---> Running in 88e0f906a572
npm notice 
npm notice New minor version of npm available! 7.15.1 -> 7.16.0
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v7.16.0>
npm notice Run `npm install -g npm@7.16.0` to update!
npm notice 
npm notice 
npm notice New minor version of npm available! 7.15.1 -> 7.16.0
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v7.16.0>
npm notice Run `npm install -g npm@7.16.0` to update!
npm notice 
Removing intermediate container 88e0f906a572
---> 37b0211fe99a
Step 12/30 : ENV NODE_ENV=production
---> Running in db15abf42b2e
Removing intermediate container db15abf42b2e
---> 1e1b5bfc11bf
Step 13/30 : WORKDIR /app
---> Running in db460e099de7
Removing intermediate container db460e099de7
---> 5bcaea65c911
Step 14/30 : COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", ".npmrc", ".\"]
---> 6f1ebb928f0d
Step 15/30 : RUN dir
---> Running in 117829a3f0f5
Volume in drive C has no label.
Volume Serial Number is 1A2C-F251
Directory of C:app
06/04/2021  04:44 PM    <DIR>          .
06/04/2021  04:44 PM    <DIR>          ..
06/04/2021  04:42 PM             2,645 .npmrc
06/04/2021  04:42 PM         1,720,232 package-lock.json
06/04/2021  04:42 PM             3,101 package.json
3 File(s)      1,725,978 bytes
2 Dir(s)  21,299,695,616 bytes free
Removing intermediate container 117829a3f0f5
---> b51123956a61
Step 16/30 : RUN npm install --production && move node_modules ..
---> Running in 8e47b2ad349e
npm ERR! code EPERM
npm ERR! syscall open
npm ERR! path C:apppackage-lock.json
npm ERR! errno -4048
npm ERR! Error: EPERM: operation not permitted, open 'C:apppackage-lock.json'
npm ERR!  [Error: EPERM: operation not permitted, open 'C:apppackage-lock.json'] {
npm ERR!   errno: -4048,
npm ERR!   code: 'EPERM',
npm ERR!   syscall: 'open',
npm ERR!   path: 'C:\app\package-lock.json'
npm ERR! }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It's possible that the file was already in use (by a text editor or antivirus),
npm ERR! or that you lack permissions to access it.
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.
npm ERR! A complete log of this run can be found in:
npm ERR!     C:UsersContainerUserAppDataLocalnpm-cache_logs2021-06-04T16_45_21_968Z-debug.log
The command 'cmd /S /C npm install --production && move node_modules ..' returned a non-zero code: 4294963248
##[error]The process 'C:Program FilesDockerdocker.exe' failed with exit code 4294963248
Finishing: Build and push Docker image

原来mcr.microsoft.com/windows/nanoserver:1809中的默认用户是ContainerUser,一个非管理员帐户。我不确定Docker的COPY命令在Windows容器上使用的确切权限。不过,在Linux上,它会创建root拥有的文件,因此在Windows中也是类似的。在npm安装过程中切换到ContainerAdministrator用户(USER ContainerAdministrator(解决了我的权限问题。

最新更新