Контейнер Docker в CircleCI не показывает файлы, даже если том выглядит подключенным - PullRequest
0 голосов
/ 18 января 2020

Это команда 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

Затем я проверил самый последний идентификатор контейнера:

$ 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.

Когда я проверяю различия между контейнерами, единственное, что я вижу, это то, что моя среда разработки запускает Docker 19 с использованием overlay2 графического драйвера и вышеупомянутой сбойной среды запускает Docker 17 с использованием aufs графического драйвера.

Обновление 2: Актуальные docker -композитные файлы:

# 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

1 Ответ

0 голосов
/ 18 января 2020

Как указал @allisongranemann, CircleCI сообщает :

Невозможно смонтировать том из рабочего пространства в контейнер в Remote 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

...