【问题标题】:How to solve docker compose cannot find module '/dockerize'如何解决 docker compose 找不到模块'/dockerize'
【发布时间】:2021-10-13 04:50:52
【问题描述】:

我有一个包含三个容器的 docker-compose 设置 - mysql db、无服务器应用程序和测试(用 mocha 测试无服务器应用程序)。在使用 docker-compose up --build 执行时,执行顺序似乎混乱并且顺序不正确。 mysql db 和 serverless app 都需要处于工作状态才能使测试正确运行(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

docker-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.js docker docker-compose


    【解决方案1】:

    您的最终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
    

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 2021-08-06
      • 2019-09-10
      • 2022-09-23
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多