作为ci过程的一部分,我正在创建一个docker machine ec2示例,并通过docker compose在其中运行2个docker容器。服务器容器测试脚本尝试连接到与ec2相同vpc中的aws elasticache redis示例。运行测试脚本时,出现以下错误:
1) Storage
check cache connection
should return seeded value in redis:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/usr/src/app/test/scripts/test.js)
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7)
更新:我可以通过redis cli从ec2本身连接:
redis-cli -c -h***.cache.amazonaws.com -p 6379 ping
> PONG
看起来我无法连接到redis示例,因为docker容器使用的ip与elasticache示例不在同一vpc中。在从远程映像构建容器时,如何设置docker配置以使用与主机相同的ip?任何帮助都将不胜感激。
mydocker-compose.yml的相关部分:
version: '3.8'
services:
server:
build:
context: ./
dockerfile: Dockerfile
image: docker.pkg.github.com/$GITHUB_REPOSITORY/$REPOSITORY_NAME-server:github_ci_$GITHUB_RUN_NUMBER
container_name: $REPOSITORY_NAME-server
command: npm run dev
ports:
- "8080:8080"
- "6379:6379"
env_file: ./.env
服务器容器dockerfile:
FROM node:12-alpine
# create app dir
WORKDIR /usr/src/app
# install dependencies
COPY package*.json ./
RUN npm install
# bundle app source
COPY . .
EXPOSE 8080 6379
CMD ["npm", "run", "dev"]
elasticache redis sg入站规则:
ec2 sg入站规则:
1条答案
按热度按时间zqry0prt1#
我通过广泛的试验和错误解决了这个问题。docker文档中的主要提示为我指明了正确的方向:
默认情况下,为容器连接到的每个docker网络分配一个ip地址。ip地址是从分配给网络的池中分配的。。。
elasticache示例只能从各自的vpc内部访问。根据我的配置,docker容器和ec2示例在两个不同的ip地址上运行,但是只有ec2ip被列入了连接elasticache的白名单。
我必须将docker容器ip绑定到我的服务器中的主机ec2ip
docker.compose.yml
通过设置容器network_mode
至"host"
: