docker-compose执行命令在主要服务依靠其他服务

在我的项目中,我有一个具有nodejs图像的nodejs 。 在docker-compose.yml文件中,我有两个服务:从Dockerfile构build的server和使用postgres图像的db

Dockerfile获取图像,为项目创build一个目录,运行npm install并设置CMD ["npm", "start"]

docker-compose.yml的内容:

 version: "2" services: server: build: . ports: - "5000:5000" volumes: - ./:/usr/src/app links: - db db: image: postgres:9.6.2 ports: - "5432:5432" volumes: - db_data:/var/lib/postgres restart: always environment: POSTGRES_PASSWORD: devel POSTGRES_USER: devel POSTGRES_DB: devel volumes: db_data: 

在我的项目中,我正在使用db-migratedb-migrate-pg驱动程序,当我尝试执行迁移时,出现下一个错误:7

 [ERROR] Error: connect ECONNREFUSED 127.0.0.1:5432 at Object.exports._errnoException (util.js:1026:11) at exports._exceptionWithHostPort (util.js:1049:20) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1136:14) npm info lifecycle project-js@1.0.0~migrate-up: Failed to exec migrate-up script npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! project-js@1.0.0 migrate-up: `db-migrate up` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the project-js@1.0.0 migrate-up script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2017-07-12T17_31_10_049Z-debug.log 

数据库的configuration是正确的,因为我可以在PgAdmin上使用它。 我不知道如何访问指出错误的文件,因为容器在结束执行后停止。

编辑:

这是错误中命名文件的完整输出:

 0 info it worked if it ends with ok 1 verbose cli [ '/usr/local/bin/node', 1 verbose cli '/usr/local/bin/npm', 1 verbose cli 'run', 1 verbose cli 'migrate-up' ] 2 info using npm@5.0.0 3 info using node@v8.0.0 4 verbose run-script [ 'premigrate-up', 'migrate-up', 'postmigrate-up' ] 5 info lifecycle project-js@1.0.0~premigrate-up: project-js@1.0.0 6 silly lifecycle project-js@1.0.0~premigrate-up: no script for premigrate-up, continuing 7 info lifecycle project-js@1.0.0~migrate-up: project-js@1.0.0 8 verbose lifecycle project-js@1.0.0~migrate-up: unsafe-perm in lifecycle true 9 verbose lifecycle project-js@1.0.0~migrate-up: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/usr/src/app/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 10 verbose lifecycle project-js@1.0.0~migrate-up: CWD: /usr/src/app 11 silly lifecycle project-js@1.0.0~migrate-up: Args: [ '-c', 'db-migrate up' ] 12 silly lifecycle project-js@1.0.0~migrate-up: Returned: code: 1 signal: null 13 info lifecycle project-js@1.0.0~migrate-up: Failed to exec migrate-up script 14 verbose stack Error: project-js@1.0.0 migrate-up: `db-migrate up` 14 verbose stack Exit status 1 14 verbose stack at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:283:16) 14 verbose stack at emitTwo (events.js:125:13) 14 verbose stack at EventEmitter.emit (events.js:213:7) 14 verbose stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) 14 verbose stack at emitTwo (events.js:125:13) 14 verbose stack at ChildProcess.emit (events.js:213:7) 14 verbose stack at maybeClose (internal/child_process.js:887:16) 14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:208:5) 15 verbose pkgid project-js@1.0.0 16 verbose cwd /usr/src/app 17 verbose Linux 4.8.0-58-generic 18 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "migrate-up" 19 verbose node v8.0.0 20 verbose npm v5.0.0 21 error code ELIFECYCLE 22 error errno 1 23 error project-js@1.0.0 migrate-up: `db-migrate up` 23 error Exit status 1 24 error Failed at the project-js@1.0.0 migrate-up script. 24 error This is probably not a problem with npm. There is likely additional logging output above. 25 verbose exit [ 1, true ] 

server容器的angular度来看,postgres在这里:

 db:5432 

每个容器都有自己的networking接口,因此每个容器都有自己的本地主机。
docker-compose为你的容器创build一个networking,并把它们放在里面。 作为奖励你得到一个DNS解决scheme,然后他们可以使用他们的服务名称相互交谈。


问:我不知道如何访问指出错误的文件,因为容器在结束执行后被停止。

这样做:

 last_stopped_container=$(docker ps -q -l) docker cp $last_stopped_container:/root/.npm/_logs/2017-07-12T17_31_10_049Z-debug.log debug.log cat debug.log 

此外,使用depends_on而不是links为了得到一些依赖启动:

 depends_on: - db 

正如我所看到的,您正在服务器启动开始时运行db-migrations; 这可能导致PostgreSQL在短时间内无法使用。 如果是这样,请执行以下操作:

 docker-compose up -d db # wait just a few seconds docker-compose up server 

这不是很优雅。 所以你将需要使用更强大的解决scheme: https : //github.com/vishnubob/wait-for-it 。 下载该脚本,将其放入服务器映像中,并使用如下所示:

  server: build: . command: /wait-for-it.sh db:5432 -- npm run #or whatever node command you have ports: - "5000:5000" volumes: - ./:/usr/src/app links: - db