shivam aima
shivam aima

Reputation: 113

How to solve docker compose cannot find module '/dockerize'

I have a docker-compose setup with three containers - mysql db, serverless app and test (to test the serverless app with mocha). On executing with docker-compose up --build, its seems like the order of execution is messed up and not in correct sequence. Both mysql db and serverless app need to be in working state in order for test to run correctly (depends_on barely works).

Hence I tried using dockerize module to set a timeout and listen to tcp ports on 3306 and 4200 before starting the test container. But I'm getting an error saying Cannot find module '/dockerize'.

Is there anything wrong with the way my docker-compose.yml and Dockerfile are setup? I'm very new to docker so any help would be welcomed.

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 [email protected]
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

Upvotes: 0

Views: 323

Answers (1)

David Maze
David Maze

Reputation: 158977

Your final test container is running a bare node image. This doesn't see or use any of the packages you install in the Dockerfile. You can set that container to also build: .; Compose will run through the build sequence a second time, but since all of the inputs are the same as the main serverless-app container, Docker will use the build cache for everything, the build will run very quickly, and you'll have two names for the same physical image.

You can also safely remove most of the options you have in the Dockerfile. You only need to specify image: with build: if you're planning to push the image to a registry; you don't need to override container_name:; the default command: should come from the Dockerfile CMD; expose: and links: are related to first-generation Docker networking and aren't necessary; overwriting the image code with volumes: results in ignoring the image contents entirely and getting host-specific behavior (just using Node on the host will be much easier than trying to convince Docker to act like a local Node development environment). So I'd trim this down to:

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

Upvotes: 1

Related Questions