我正在尝试dockerize一个项目的应用程序。我使用node.js作为我的服务器。在dockerization的过程中,它抛出这个错误:
cloud_project2-projectapp-1 | npm ERR! code ENOENT
cloud_project2-projectapp-1 | npm ERR! syscall open
cloud_project2-projectapp-1 | npm ERR! path /projectapp/package.json
cloud_project2-projectapp-1 | npm ERR! errno -2
cloud_project2-projectapp-1 | npm ERR! enoent ENOENT: no such file or directory, open '/projectapp/package.json'
cloud_project2-projectapp-1 | npm ERR! enoent This is related to npm not being able to find a file.
cloud_project2-projectapp-1 | npm ERR! enoent
这是我的Dockerfile
:
FROM node:18-alpine
WORKDIR /projectapp
COPY package*.json .
RUN npm ci
COPY . .
ENV PORT = 8080
EXPOSE 8080
CMD ["npm","run","devStart"]
dockerfile和我在很多视频和文档中看到的完全一样。我相信这个错误是在RUN npm ci命令中抛出的,由于某种原因它找不到包。json文件,即使我复制它在上面的命令。我也搜索了一些答案,也许这是一个特权问题,但我是linux的新手,很难理解这些。
我在mysql和keyrock中得到了更多的错误,但我稍后会调试这些错误。
version: "3.9"
networks:
idm_network:
driver: bridge
#project images
services:
projectapp:
build:
context: ./projectapp
networks:
- idm_network
volumes:
- .:/projectapp #for development phase only
ports:
- "8080:8080"
mysql:
build:
context:
./mysql
networks:
- idm_network
volumes:
- project-mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=idm
- MYSQL_ROOT_HOST=%
keyrock:
image: fiware/idm:latest
networks:
- idm_network
depends_on:
- mysql
environment:
- IDM_DB_HOST=mysql
mongo-orion:
image: mongo:latest
volumes:
- project-mongo-orion-data:/data/db
networks:
- idm_network
command: --nojournal
orion:
image: fiware/orion
links:
- mongo-orion
networks:
- idm_network
command: -dbhost mongo-orion
mongo-data:
build:
context: ./mongoData
volumes:
- project-mongo-data:/data/db
networks:
- idm_network
data-storage-server:
build:
context: ./dataStorageServer
volumes:
- .:/dataserver #for development phase only
depends_on:
- mongo-data
networks:
- idm_network
#pep-proxy-datastorage:
# image: fiware/pep-proxy:latest
# networks:
# - idm_network
#pep-proxy-orion:
#image: fiware/pep-proxy:latest
#networks:
# - idm_network
#project volumes
volumes:
project-mysql-data:
project-mongo-orion-data:
project-mongo-data:
删除projectapp
下的volumes:
块
这个块的作用是用主机系统的内容替换图像中的整个应用程序。(想象一下,正常安装Node的一个副本,然后分别检出Node的源代码,并将其解压缩到已经安装的Node上。)没有特别的保证或检查图像和主机内容"匹配"。像node_modules
树这样的东西,图像npm install
s也被隐藏了。
在您的示例中,您从./projectapp
子目录构建映像,但是在映像代码上绑定挂载当前目录.
。这将导致在运行容器时没有package.json
,从而产生您所看到的错误。
我可能对这个设置再做两个更改。如果您删除文件中所有的networks:
块,Compose将创建一个名为default
的网络,并将所有容器附加到它;这将以与您现在拥有的网络完全相同的方式工作,但需要更少的设置。您还可以使用一个简写的build: directoryname
,其含义与您现在使用的build: { context: directoryname }
相同。这样,再加上删除不必要的volumes:
,将得到
version: '3.8'
services:
projectapp:
build: ./projectapp
ports:
- "8080:8080"
...
mongo-data:
build: ./mongoData
volumes: # keep volumes for persistent database data
- project-mongo-data:/data/db
data-storage-server:
build: ./dataStorageServer
depends_on:
- mongo-data
orion
服务也有过时的links:
选项,你可以只是删除该块以及(或将其更改为depends_on:
);名称mongo-orion
仍然可以通过正常的Docker网络解析。
问题是我有这样一行:
volumes:
- .:/projectapp #for development phase only
这样我就不必每次修改时都重新启动docker,但是它产生了一个问题。