Nodejs ve express kullanarak basit bir uygulama çalıştırıyorum. Uygulamanın bir docker imajını oluşturmaya ve docker compose kullanarak imaj ile bir konteyner oluşturmaya çalışıyorum. Oluşan konteynerdeki çalışma alanındaki dosyaları (bu durumda index.js, package.json ve diğer dosyalar) docker-compose.yml dosyasının bulunduğu dizindeki ./test dizinine mount etmek istiyorum ancak hata alıyorum.
Burada şunu belirtmem lazım: express-app klasöründe image oluşturuyorum test-app klasöründe ise docker compose yaml dosyası oluşturuyorum. İkisi birbirinden bağımsız ortamlardalar.
index.js
// index.js
const express = require("express");
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello Docker Compose!");
});
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
package.json
{
"name": "my-node-app",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"express": "^4.17.1"
},
"scripts": {
"start": "node index.js"
}
}
Dockerfile
FROM node:14
WORKDIR /app
COPY package.json /app
COPY index.js /app
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
“docker build -t express-app:latest .” Komutu ile uygulamayı build ediyorum.
Test-app isimli başka bir klasörde ise “docker compose up” komutu ile aşağıdaki docker-compose.yml dosyasını çalıştırıyorum
Konteyner içerisindeki workdir içerisindeki dosyalar ./test klasörüne gelmiyor ve aşağıdaki hatayı alıyorum.
Attaching to test-app-express-app-1
test-app-express-app-1 | npm ERR! code ENOENT
test-app-express-app-1 | npm ERR! syscall open
test-app-express-app-1 | npm ERR! path /app/package.json
test-app-express-app-1 | npm ERR! errno -2
test-app-express-app-1 | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
test-app-express-app-1 | npm ERR! enoent This is related to npm not being able to find a file.
test-app-express-app-1 | npm ERR! enoent
test-app-express-app-1 |
test-app-express-app-1 | npm ERR! A complete log of this run can be found in:
test-app-express-app-1 | npm ERR! /root/.npm/_logs/2023-11-17T15_23_04_691Z-debug.log
test-app-express-app-1 exited with code 254
Yapmak istediğim çok basit bir şey, dockerfile ile bir image oluştur. ardından docker compose ile bu imge’ı kullan, kullanırken de bir volume oluştur onu da klasöre bağla ama olmuyor.
İmage oluşturmada bir problem yok bu arada. docker-compose.yml dosyasını böyle configure ettiğimde sorunsuz çalışıyor ama ben böyle yapmak istemiyorum.
version: '3'
services:
express-app:
container_name:test
image: express-app:latest
ports:
- 3000:3000
volumes:
- test:/app
volumes:
test:
Strapinin eski versiyonlarında istediğim kullanıma uygun bir örnek yml dosyası var. o yml dosyasını da paylaşıyorum aşağıda. Onda tam olarak istediğim şekilde çalışıyor.
version: '3'
services:
strapi:
container_name: strapi
image: strapi/strapi
environment:
- NODE_ENV=production
- DATABASE_CLIENT=postgres
- DATABASE_HOST=db
- DATABASE_PORT=5432
- DATABASE_NAME=strapi
- DATABASE_USERNAME=strapi
- DATABASE_PASSWORD=strapi
ports:
- 1337:1337
volumes:
- ./app:/srv/app
depends_on:
- db
command: 'strapi start'
db:
container_name: postgres
image: postgres
restart: always
volumes:
- ./db:/var/lib/postgresql/data
environment:
POSTGRES_USER: strapi
POSTGRES_PASSWORD: strapi
POSTGRES_DB: strapi
Neyi yanlış yapıyorum? anlayamıyorum…