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

docker工人,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

等待脚本工作正常,但是它覆盖了Web容器的现有启动命令: 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 web_1 | ./wait-for-it.sh: line 174: exec: npm start: not found

这里发生了什么?

所以,首先如果你在docker-compose使用command ,那么它将覆盖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 

无论你喜欢什么格式