Как монтировать тома с помощью docker-compose внутри и за пределами VSCode devcontainer?

#docker #visual-studio-code #docker-compose #vscode-devcontainer

#docker #visual-studio-code #docker-compose #vscode-devcontainer

Вопрос:

Сценарий

Проект, над которым я работаю (приложение React), используется docker-compose для настройки его серверной части, веб-сервера и интерфейса. Я работаю внутри VSCode devcontainer (узел с Typescript).

Настроенный мной Docker в среде Docker, похоже, работает нормально, и я могу запускать каждый из контейнеров Docker, но мне пришлось адаптировать код следующим образом, потому что в противном случае Docker не смог найти указанные тома для монтирования.

Настройка

Сначала мне нужно было установить переменную удаленного окружения в моем devcontainer.json :

 "remoteEnv": {
    // the original host directory which is needed for volume mount commands from inside the container (Docker in Docker)
    "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}"
}
 

Затем я использую эту переменную среды docker-compose.yaml примерно так:

 services: 

  webserver:
      build: 
          context: ./docker
          dockerfile: webserver/Dockerfile
      image: webserver
      container_name: webserver_nginx
      ports:
          - 8080:80
      volumes:
          -  ${LOCAL_WORKSPACE_FOLDER}/webserver:/etc/nginx/conf.d
          -  ${LOCAL_WORKSPACE_FOLDER}/build:/var/www/html
      restart: unless-stopped
      depends_on: 
        - backend

  backend:
      ...
 

Проблема

На моей машине (и на машине моих коллег, которые также используют VSCode) все работает нормально. Но у меня есть некоторые участники teams, которые не используют VSCode. Когда я фиксирую адаптированный docker-compose.yaml файл, их настройка больше не работает, и наоборот, если они снова адаптируют файл к своим потребностям.

Вопрос

Как я могу гарантировать, что Docker compose работает внутри и за пределами VSCode devcontainers ?

Возможные решения?

  • Можно ли установить для переменной среды значение по умолчанию?Потому что в моем случае фактическое значение, которое должно быть установлено, если проект не открыт внутри a devcontainer , — это просто простая точка ( . ) . Потому что, когда я запускаю команду echo ${LOCAL_WORKSPACE_FOLDER} внутри встроенного терминала VSCode, печатается правильный путь. Похоже, что VSCode просто устанавливает обычные переменные среды?
  • (Если предположение выше верно) разве нельзя было бы написать простой скрипт Bash install.sh , который автоматически задает правильный путь?Этот скрипт следует запускать только один раз во время настройки проекта. Как может выглядеть этот файл?

Комментарии:

1. Почему вы не указываете ‘./ webserver’ в качестве тома? Это должно работать и внутри вашего vscode…

Ответ №1:

Docker compose разрешает значение по умолчанию для переменных:

Значение ${VARIABLE:-default} устанавливается по умолчанию, если ПЕРЕМЕННАЯ не установлена или пуста в среде.

См.: https://docs.docker.com/compose/environment-variables /

Для вашего примера вы можете использовать:

$ {LOCAL_WORKSPACE_FOLDER:-.}

PS: Я никогда не использовал это лично