docker compose容器中的Node.js可以';不能使用绝对路径访问资源

docker compose容器中的Node.js可以';不能使用绝对路径访问资源,node.js,docker,docker-compose,Node.js,Docker,Docker Compose,我正在使用Node.js,我正在尝试对其进行dockerize。有一段代码提供存储在serviceAccount.json文件中的Google应用程序凭据,如下所示: const googleApplicationCredentials = config.GOOGLE_APPLICATION_CREDENTIALS; const serviceAccount = require(googleApplicationCredentials); admin.initializeApp({ c

我正在使用Node.js,我正在尝试对其进行dockerize。有一段代码提供存储在serviceAccount.json文件中的Google应用程序凭据,如下所示:

const googleApplicationCredentials = config.GOOGLE_APPLICATION_CREDENTIALS;
const serviceAccount = require(googleApplicationCredentials);

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://databasename.firebaseio.com"
});
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./server
    volumes:
      - /app/node_modules
      - ./server:/app
    environment:
      - GOOGLE_APPLICATION_CREDENTIALS="/app/serviceAccount.json"
此凭证文件的路径从docker compose中提取,如下所示:

const googleApplicationCredentials = config.GOOGLE_APPLICATION_CREDENTIALS;
const serviceAccount = require(googleApplicationCredentials);

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://databasename.firebaseio.com"
});
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./server
    volumes:
      - /app/node_modules
      - ./server:/app
    environment:
      - GOOGLE_APPLICATION_CREDENTIALS="/app/serviceAccount.json"
Docker文件如下:

FROM node:14.14.0-alpine
WORKDIR "/app"
COPY ./package.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "start"]
当我ssh到docker容器时,我可以在工作目录/app下看到servicecomport.json。 但是,当我启动docker componse时,我得到以下错误:

Cred:"/app/serviceAccount.json"
api_1     | internal/modules/cjs/loader.js:883
api_1     |   throw err;
api_1     |   ^
api_1     |
api_1     | Error: Cannot find module '"/app/serviceAccount.json"'
api_1     | Require stack:
api_1     | - /app/src/firebaseInit.js
api_1     | - /app/src/services/notification.service.js
api_1     | - /app/src/controllers/messages.controller.js
api_1     | - /app/src/routes/consultingchannel.routes.js
api_1     | - /app/src/express.js
api_1     | - /app/src/server.js
api_1     |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
api_1     |     at Function.Module._load (internal/modules/cjs/loader.js:725:27)
api_1     |     at Module.require (internal/modules/cjs/loader.js:952:19)
api_1     |     at require (internal/modules/cjs/helpers.js:88:18)
api_1     |     at Object.<anonymous> (/app/src/firebaseInit.js:8:24)
api_1     |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
api_1     |     at Module._compile (/app/node_modules/pirates/lib/index.js:99:24)
api_1     |     at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
api_1     |     at Object.newLoader [as .js] (/app/node_modules/pirates/lib/index.js:104:7)
api_1     |     at Module.load (internal/modules/cjs/loader.js:928:32)
api_1     |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
api_1     |     at Module.require (internal/modules/cjs/loader.js:952:19)
api_1     |     at require (internal/modules/cjs/helpers.js:88:18)
api_1     |     at Object.<anonymous> (/app/src/services/notification.service.js:4:1)
api_1     |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
api_1     |     at Module._compile (/app/node_modules/pirates/lib/index.js:99:24)
api_1     |     at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
api_1     |     at Object.newLoader [as .js] (/app/node_modules/pirates/lib/index.js:104:7)
api_1     |     at Module.load (internal/modules/cjs/loader.js:928:32)
api_1     |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
api_1     |     at Module.require (internal/modules/cjs/loader.js:952:19)
api_1     |     at require (internal/modules/cjs/helpers.js:88:18) {
api_1     |   code: 'MODULE_NOT_FOUND',
api_1     |   requireStack: [
api_1     |     '/app/src/firebaseInit.js',
api_1     |     '/app/src/services/notification.service.js',
api_1     |     '/app/src/controllers/messages.controller.js',
api_1     |     '/app/src/routes/consultingchannel.routes.js',
api_1     |     '/app/src/express.js',
api_1     |     '/app/src/server.js'
api_1     |   ]
api_1     | }
api_1     | [nodemon] app crashed - waiting for file changes before starting...
client_1  | Compiled with warnings.

查看docker compose中的卷定义,将/server目录装载到/app。我想这就解释了为什么当您ssh到容器中时它可以工作,而当您
docker组合起来时它不能工作,在后一种情况下,没有装入卷

volumes:
  - /app/node_modules
   # The culprit?
  - ./server:/app

我不太清楚你的建议是什么。服务器是我的主机上的目录,根目录中包含servicecomport.json文件。在docker compose中,此卷将服务器目录从主机映射到docker容器中的/app。当我对用它初始化的容器运行docker compose和SSH时,我看到了该文件,这意味着卷已装入。至少我是这样理解的。但是,在初始化过程中,node.js服务器无法启动,因为它找不到此文件。为了测试它是否与卷相关,我已将卷从docker-compose.yml中完全删除,并将“COPY./servicecomport.json/usr/”添加到Dockerfile中。该文件现在以/usr/servicecomport.json的形式复制到容器中,但节点代码仍然会生成相同的错误,只是位置不同错误:找不到模块'/usr/servicecomport.json''