在两个容器之间共享文件

时间:2018-05-26 12:30:45

标签: docker docker-compose docker-volume

几个小时后,我正在与码头组合作斗争。我正在构建角度应用程序。我可以看到dist目录中的文件。现在我想与nginx容器共享这些文件。我以为共享卷会这样做。但是当我添加

services:
    client:
       volumes: 
            - static:/app/client/dist
    nginx:
          volumes: 
            - static:share/user/nginx/html

volumes:
   static:

尝试docker-compose up --build 我收到了这个错误

client_1  | EBUSY: resource busy or locked, rmdir '/app/client/dist'
client_1  | Error: EBUSY: resource busy or locked, rmdir '/app/client/dist'
client_1  |     at Object.fs.rmdirSync (fs.js:863:18)
client_1  |     at rmdirSync (/app/client/node_modules/fs-extra/lib/remove/rimraf.js:276:13)
client_1  |     at Object.rimrafSync [as removeSync] (/app/client/node_modules/fs-extra/lib/remove/rimraf.js:252:7)
client_1  |     at Class.run (/app/client/node_modules/@angular/cli/tasks/build.js:29:16)
client_1  |     at Class.run (/app/client/node_modules/@angular/cli/commands/build.js:250:40)
client_1  |     at resolve (/app/client/node_modules/@angular/cli/ember-cli/lib/models/command.js:261:20)
client_1  |     at new Promise (<anonymous>)
client_1  |     at Class.validateAndRun (/app/client/node_modules/@angular/cli/ember-cli/lib/models/command.js:240:12)
client_1  |     at Promise.resolve.then.then (/app/client/node_modules/@angular/cli/ember-cli/lib/cli/cli.js:140:24)
client_1  |     at <anonymous>
client_1  | npm ERR! code ELIFECYCLE
client_1  | npm ERR! errno 1
client_1  | npm ERR! app@0.0.0 build: `ng build --prod`
client_1  | npm ERR! Exit status 1
client_1  | npm ERR! 
client_1  | npm ERR! Failed at the app@0.0.0 build-prod script.
client_1  | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

完全赞赏任何帮助

2 个答案:

答案 0 :(得分:1)

您可以尝试在不使用命名卷的情况下解决它:

services:
    client:
       volumes: 
            - ./static-content:client/app/dist
    nginx:
          volumes: 
            - ./static-content:share/user/nginx/html

答案 1 :(得分:1)

我认为,正如错误所暗示的那样,这是一个僵局。您的docker-compose文件具有2个服务,如果不同时启动,它们大约会同时启动。它们都在Docker卷上具有某种控制权(称为“静态”)。当Angular执行ng build时,默认情况下,--deleteOutputPath设置为true。并且当它尝试删除输出目录时,会出现您收到的错误消息。

如果将deleteOutputPath设置为false,则应解决该问题。也许这足以满足您的需求。如果没有,或者将--outputPath设置为项目目录中的临时目录,并在Angular构建之后,将内容移至Docker卷中。如果临时目录路径为out/dist,并且卷映射到dist,则可以使用它:

ng build && cp -rf ./out/dist/* ./dist

但是,该替代解决方案实际上只是在解决问题。需要说明的是,docker-compose depends_on键在这种情况下将无济于事,因为它仅表示依赖关系,与依赖服务的“就绪”无关。

另外要注意的是,执行docker volume rm <name>不会对解决方案产生任何影响。请记住,在尝试删除卷时,这两种服务都会保留该卷。

一个想法,尚未测试,因为另一种替代解决方案是删除输出路径中的内容。并将deleteOutputPath设置为false,因为Angular似乎正在尝试删除目录本身。

更新

因此删除输出路径中的内容似乎可行!如前所述,将deleteOutputPath设置为false。在package.json文件的scripts对象中,具有类似以下内容:

{
  "scripts": {
    "build:production": "rm -rf ./dist/* && ng build --configuration production",
  }
}