CircleCI中的Docker容器即使已显示卷也未显示文件

问题描述 投票:0回答:1

这是docker-compose命令和结果:

$ docker-compose -f docker-compose-base.yml -f docker-compose-test.yml run api sh -c 'pwd && ls'
Starting test-db ... done
/usr/src/api
node_modules

然后我检查了最近的容器ID:

$ docker inspect  --format='{{json .Mounts}}' e150beeef85c
[
  {
    "Type": "bind",
    "Source": "/home/circleci/project",
    "Destination": "/usr/src/api",
    "Mode": "rw",
    "RW": true,
    "Propagation": "rprivate"
  },
  {
    "Type": "volume",
    "Name": "4f86174ca322af6d15489da91f745861815a02f5b4e9e879ef5375663b9defff",
    "Source": "/var/lib/docker/volumes/4f86174ca322af6d15489da91f745861815a02f5b4e9e879ef5375663b9defff/_data",
    "Destination": "/usr/src/api/node_modules",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

这意味着这些文件没有出现:

$ ls /home/circleci/project
Dockerfile  docker-compose-base.yml  docker-compose-prod.yml  migrations     nodemon-debug.json  package-lock.json  src   test-db.env  tsconfig.build.json  tslint.json
README.md   docker-compose-dev.yml   docker-compose-test.yml  nest-cli.json  nodemon.json        package.json       test  test.env     tsconfig.json

为什么会这样?

更新:我应该提到,所有这些在我的本地开发环境中都可以正常工作。在CircleCI上,以上操作均失败。

[当我检查容器之间的差异时,我看到的主要主要事情是我的开发环境使用overlay2图形驱动程序运行Docker 19,而上述失败的环境使用aufs图形驱动程序运行Docker 17。

更新2:实际的docker-compose文件:

# docker-compose-base.yml
version: '3'

services:
  api:
    build: .
    restart: on-failure
    container_name: api
# docker-compose-test.yml
version: '3'

networks:
  default:
    external:
      name: lb_lbnet

services:
  test-db:
    image: postgres:11
    container_name: test-db
    env_file:
      - ./test-db.env # uses POSTGRES_DB and POSTGRES_PASSWORD to create a fresh db with a password when first run

  api:
    restart: 'no'
    env_file:
      - test.env
    volumes:
      - ./:/usr/src/api
      - /usr/src/api/node_modules
    depends_on:
      - test-db
    ports:
      - 9229:9229
      - 3000:3000
    command: npm run start:debug

最后是Dockerfile

FROM node:11

WORKDIR /usr/src/api

COPY package*.json ./

RUN npm install

COPY . .

# not using an execution list here so we get shell variable substitution
CMD npm run start:$NODE_ENV
docker docker-compose circleci
1个回答
0
投票

正如@allisongranemann指出的,CircleCI states

无法将作业空间中的卷挂载到远程Docker中的容器(反之亦然)。

我想将项目目录挂载到docker的最初原因是,在开发环境中,我可以快速更改代码并运行测试,而无需重建容器。

由于这个限制,我要采取的解决方案是按照以下步骤从docker-compose-test.yml中删除装入的卷:

version: '3'

services:
  test-db:
    image: postgres:11
    container_name: test-db
    env_file:
      - ./test-db.env # uses POSTGRES_DB and POSTGRES_PASSWORD to create a fresh db with a password when first run

  api:
    restart: 'no'
    env_file:
      - test.env
    depends_on:
      - test-db
    ports:
      - 9229:9229
      - 3000:3000
    command: npm run start:debug

而且我还添加了docker-compose-test-dev.yml,它为开发环境添加了卷:

version: '3'

services:
  api:
    volumes:
      - ./:/usr/src/api

最后,要在开发环境上运行测试,我运行:

docker-compose -f docker-compose-base.yml -f docker-compose-test.yml -f docker-compose-test-dev.yml run api npm run test:e2e

© www.soinside.com 2019 - 2024. All rights reserved.