'Express server can't read key in Docker container
I am dockerizing a system that uses a pem and key to authenticate with a remote dev server. Unfortunately, it would appear that it is unable to find the file despite it being in the docker image.
Error
server_1 | Error: ENOENT: no such file or directory, open '/app/certificates/jwt.key'
server_1 | at Object.openSync (fs.js:497:3)
server_1 | at Object.readFileSync (fs.js:393:35)
server_1 | at Object.<anonymous> (/app/controllers/user.js:7:16)
server_1 | at Module._compile (internal/modules/cjs/loader.js:1085:14)
server_1 | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
server_1 | at Module.load (internal/modules/cjs/loader.js:950:32)
server_1 | at Function.Module._load (internal/modules/cjs/loader.js:790:12)
server_1 | at Module.require (internal/modules/cjs/loader.js:974:19)
server_1 | at require (internal/modules/cjs/helpers.js:101:18)
server_1 | at Object.<anonymous> (/app/routes/upload.js:8:24)
server_1 | at Module._compile (internal/modules/cjs/loader.js:1085:14)
server_1 | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
server_1 | at Module.load (internal/modules/cjs/loader.js:950:32)
server_1 | at Function.Module._load (internal/modules/cjs/loader.js:790:12)
server_1 | at Module.require (internal/modules/cjs/loader.js:974:19)
server_1 | at require (internal/modules/cjs/helpers.js:101:18) {
server_1 | errno: -2,
server_1 | syscall: 'open',
server_1 | code: 'ENOENT',
server_1 | path: '/app/certificates/jwt.key'
server_1 | }
Line (server/controllers/user.js -> app/controllers/user.js)
const pem = fs.readFileSync(path.resolve(__dirname, "../certificates/jwt.key"));
Dockerfile
FROM node:14
RUN mkdir app
WORKDIR /app
COPY . .
RUN npm install
RUN npm run get_key
EXPOSE 5000
CMD [ "npm", "run", "start" ]
package.json
"scripts": {
"test": "mocha -r dotenv/config ./**/*.test.js",
"start": "node -r dotenv/config server.js",
"dev": "nodemon -r dotenv/config server.js",
"get_key": "ssh-keygen -t rsa -b 4096 -m PEM -f ./certificates/jwt.key -P ''"
},
Solution 1:[1]
The volume mount was overriding the key building. Need to generate the key locally first before composing.
server:
build: server
ports:
- "5000:5000"
restart: always
depends_on:
- mongodb
volumes:
- ./server:/app
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Michael Paccione |