首页 > 解决方案 > 如何解决 docker compose 找不到模块'/dockerize'

问题描述

我有一个带有三个容器的 docker-compose 设置 - mysql db、无服务器应用程序和测试(用 mocha 测试无服务器应用程序)。在使用 docker-compose up --build 执行时,执行顺序似乎混乱并且顺序不正确。mysql db 和无服务器应用程序都需要处于工作状态才能使测试正确运行(depends_on 几乎无法正常工作)。

因此,在启动测试容器之前,我尝试使用 dockerize 模块设置超时并监听 3306 和 4200 上的 tcp 端口。但我收到一个错误消息Cannot find module '/dockerize'

我的 docker-compose.yml 和 Dockerfile 的设置方式有什么问题吗?我对 docker 很陌生,所以欢迎任何帮助。

Dockerfile.yml

FROM node:12

# Create app directory
RUN mkdir -p /app
WORKDIR /app

# Dockerize is needed to sync containers startup
ENV DOCKERIZE_VERSION v0.6.0
RUN wget --no-check-certificate https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz

# Install app dependencies
COPY package.json /app/
COPY package-lock.json /app/
RUN npm install -g serverless@2.41.2
RUN npm install

# Bundle app source
COPY . /app

码头工人-compose.yml

version: '3'
services:
  mysql-coredb:
    image: mysql:5.6
    container_name: mysql-coredb
    expose: 
      - "3306"
    ports:
      - "3306:3306"

  serverless-app:
    build: .
    image: serverless-app
    container_name: serverless-app
    depends_on:
      - mysql-coredb
    command: sls offline --stage local --host 0.0.0.0
    expose: 
      - "4200"
    ports:
      - "4200:4200"
    links:
      - mysql-coredb
    volumes:
      - /app/node_modules
      - .:/app

  test:
    image: node:12
    working_dir: /app
    container_name: test
    volumes:
      - /app/node_modules
      - .:/app
    command: dockerize
        -wait tcp://serverless-app:4200 -wait tcp://mysql-coredb:3306 -timeout 15s
        bash -c "npm test"
    depends_on:
      - mysql-coredb
      - serverless-app
    links:
      - serverless-app

标签: node.jsdockerdocker-compose

解决方案


您的最终test容器正在运行一个裸node映像。这不会看到或使用您在 Dockerfile 中安装的任何包。您可以将该容器设置为也build: .;Compose 将再次运行构建序列,但由于所有输入都与主serverless-app容器相同,Docker 将对所有内容使用构建缓存,构建将运行得非常快,并且您将有两个名称相同的物理图像。

您还可以安全地删除 Dockerfile 中的大部分选项。如果您打算将图像推送到注册表,image:您只需要指定;build:你不需要覆盖container_name:;默认值command:应该来自 Dockerfile CMDexpose:并且links:与第一代 Docker 网络相关,不是必需的;覆盖图像代码volumes:会导致完全忽略图像内容并获得特定于主机的行为(仅在主机上使用 Node 比试图说服 Docker 像本地 Node 开发环境一样工作要容易得多)。因此,我将其精简为:

version: '3.8'
services:
  mysql-coredb:
    image: mysql:5.6
    ports:
      - "3306:3306"

  serverless-app:
    build: .
    depends_on:
      - mysql-coredb
    ports:
      - "4200:4200"

  test:
    build: .
    command: >-
      dockerize
      -wait tcp://serverless-app:4200
      -wait tcp://mysql-coredb:3306
      -timeout 15s
      npm test
    depends_on:
      - mysql-coredb
      - serverless-app

推荐阅读