node.js - 如何解决 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
解决方案
您的最终test
容器正在运行一个裸node
映像。这不会看到或使用您在 Dockerfile 中安装的任何包。您可以将该容器设置为也build: .
;Compose 将再次运行构建序列,但由于所有输入都与主serverless-app
容器相同,Docker 将对所有内容使用构建缓存,构建将运行得非常快,并且您将有两个名称相同的物理图像。
您还可以安全地删除 Dockerfile 中的大部分选项。如果您打算将图像推送到注册表,image:
您只需要指定;build:
你不需要覆盖container_name:
;默认值command:
应该来自 Dockerfile CMD
;expose:
并且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
推荐阅读
- mysql - 如何根据 MySQL 中的状态获取最大时间?
- android - 双击主屏幕android
- api - 行填充特定行?
- c# - .Net Core 3.1 身份验证/授权问题
- python - Django html按钮没有用硒打开网络浏览器
- python - 带有 LOADED JSON 而非文件的 Python 的 GCP 身份验证
- visual-studio-mac - 如何在 Mac 终端中从 Visual Studio 运行应用程序
- python - 使用 groupby 进行计数后,我想通过 groupby 变量进行绘图
- php - 尝试在 ubuntu 20.04 上安装 php-mbstring
- json - 如何使用 jq 在每个 json 上附加额外的换行符