等待脚本会覆盖默认CMD并退出Docker容器

时间:2017-08-02 08:07:54

标签: docker docker-compose wait

多克尔-compose.yaml:

version: "3"
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_HOST: localhost
      MYSQL_DATABASE: mydb
      MYSQL_USER: mysql
      MYSQL_PASSWORD: 1234
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3307:3306"
    expose:
      - 3307
    volumes:
      - /var/lib/mysql
      - ./mysql/migrations:/docker-entrypoint-initdb.d
    restart: unless-stopped
  web:
    build:
      context: .
      dockerfile: web/Dockerfile
    volumes:
      - ./:/web
    ports:
      - "32768:3000"
    environment:
      NODE_ENV: development
      PORT: 3000
    links:
      - mysql:mysql
    depends_on:
      - mysql
    expose:
      - 3000
    command: ["./wait-for-it.sh", "mysql:3306", "--", "npm start"]

Web Dockerfile:

FROM node:6.11.2-slim

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

CMD [ "npm", "start" ] # So this is overridden by the wait script and doesn't execute

我正在使用此等待脚本: https://github.com/vishnubob/wait-for-it

wait脚本工作正常,但是它会覆盖Web容器的现有start命令: CMD [ "npm", "start" ]

正如你在docker-compose文件中看到的那样,我使用这种方法启动npm start:
command: ["./wait-for-it.sh", "mysql:3306", "--", "npm start"]

我尝试了一些替代方案,例如: command: ["./wait-for-it.sh", "mysql:3306", "--", "CMD ['npm', 'start'"]
command: ["./wait-for-it.sh", "mysql:3306", "--", "docker-entrypoint.sh"]

只有它不起作用。我从Web容器中收到此错误: web_1 | ./wait-for-it.sh: line 174: exec: npm start: not found

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

首先,如果您在command中使用docker-compose,那么它将覆盖CMD,这是预期的行为。 docker如何知道你想要执行它们。

接下来你的方法对CMD来说有点不对劲

command: ["./wait-for-it.sh", "mysql:3306", "--", "npm start"]

转换为您执行

./wait-for-it.sh mysql:3306 -- "npm start"

这应该是失败的,因为没有命令npm start它是npm,它以参数开始。所以将命令改为

command: ["./wait-for-it.sh", "mysql:3306", "--", "npm", "start"]

command: ./wait-for-it.sh mysql:3306" -- npm start

您喜欢哪种格式