docker compose容器中的Node.js可以';不能使用绝对路径访问资源
我正在使用Node.js,我正在尝试对其进行dockerize。有一段代码提供存储在serviceAccount.json文件中的Google应用程序凭据,如下所示: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
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''