Каталоги для docker-compose bind mount кажутся Dockerfile невидимыми - PullRequest
0 голосов
/ 07 мая 2019

У меня есть файл docker-compose.yml и файл Docker. Я добавил привязное крепление. Если я не попытаюсь скомпилировать или выполнить какие-либо команды mix, получаю docker-compose для «up» и запускаю интерактивную оболочку. На самом деле я вижу том «bind» и все файлы.

Проблема в том, что когда я пытаюсь выполнить команду cd или выполнить команду в этом каталоге - она ​​как бы не существует и «возвращает код выхода с 1» ошибка

докер-compose.yml

        # Version of docker-compose
    version: '3.7'

    # Containers we are going to run
    services:
      # Our Phoenix container
      phoenix:
        # The build parameters for this container.
        build:
          # Here we define that it should build from the current directory
          context: .
        environment:
          # Variables to connect to our Postgres server
          PGUSER: gametime_dev
          PGPASSWORD: gametime-dev
          PGDATABASE: gametime_dev
          PGPORT: 5432
          # Hostname of our Postgres container
          PGHOST: db
        ports:
          # Mapping the port to make the Phoenix app accessible outside of the container
          - "4000:4000"
        depends_on:
          # The db container needs to be started before we start this container
          - db
          - redis
        volumes:
          - type: bind
            source: .
            target: /opt/gametime
      redis:
        image: "redis:alpine"
        ports:
          - "6379:6379"
        sysctls:
          net.core.somaxconn: 1024

      db:
        # We use the predefined Postgres image
        image: kartoza/postgis:11.0-2.5
        environment:
          # Set user/password for Postgres
          POSTGRES_USER: gametime_dev
          POSTGRES_PASS: gametime-dev
          # Set a path where Postgres should store the data
          PGDATA: /var/lib/postgresql/data/pgdata
        restart: always
        volumes:
          - pgdata:/usr/local/var/postgres_data
    # Define the volumes
    volumes:
      pgdata:

Dockerfile:

        # Latest version of Erlang-based Elixir installation: https://hub.docker.com/_/elixir/
    FROM bitwalker/alpine-elixir-phoenix as build
                                                                                                                                                                                  RUN apk update && \
      apk add postgresql-client
                                                                                                                                                                                  # Create and set home directory
    ENV HOME /opt/gametime                                                                                                                                                        WORKDIR $HOME
                                                                                                                                                                                  # Configure required environment
    ENV MIX_ENV dev                                                                                                                                                               # Set and expose PORT environmental variable
                                                                                                                                                                                  ENV PORT ${PORT:-4000}
    EXPOSE $PORT
    VOLUME /opt/gametime

                                                                                                                                                                                  # Install hex (Elixir package manager)
    RUN mix local.hex --force
    # Install rebar (Erlang build tool)                                                                                                                                           RUN mix local.rebar --force
                                                                                                                                                                                  # Copy all dependencies files
    # not commenting this out defeats the purpose of needing the volume
    # COPY mix.* ./
    # Install all production dependencies                                                                                                                                         RUN mix deps.get --only dev
                                                                                                                                                                                  # Compile all dependencies
    #THIS FAILS - BECAUSE IT CAN'T FIND THE mix.exs file
    RUN mix deps.compile
    # Copy all application files                                                                                                                                                  # COPY . .

    # Compile the entire project                                                                                                                                                  
    RUN mix compile
    # IF I COMMENT OUT THE ABOVE THIS ALSO FAILS BECAUSE IT CAN'T FIND ASSETS DIRECTORY                                                                                                                                                                   
    RUN cd assets && npm install

    CMD ["./entrypoint.sh"]

Ошибка:

    Step 11/15 : RUN mix deps.get --only dev
 ---> Running in 831e2e0d3fe2
** (Mix) Could not find a Mix.Project, please ensure you are running 
Mix in a directory with a mix.exs file
ERROR: Service 'phoenix' failed to build: The command '/bin/sh -c mix 
deps.get --only dev' returned a non-zero code: 1

Что я пытаюсь сделать - это РАЗДЕЛИТЬ каталог приложения и использовать библиотеки elixir / erlang / OTP в контейнере для сборки и запуска этого кода. Таким образом, у меня будет среда разработки, и любые сделанные мной изменения будут сохранены на моем локальном компьютере.

Я могу получить данные из github, чтобы быть честными, и затем зафиксировать изменения, прежде чем уничтожить мой контейнер. Но я хотел сначала попробовать это.

[ОБНОВЛЕНИЕ]: Итак, я понял, что, если я запускаю команды микширования в файле entrypoiont.sh, все работает просто отлично. Я не знаю, почему том недоступен в Dockerfile и по этой причине не ответил на мой собственный вопрос. Я получил ключ от здесь .

Причина, по которой я хотел сделать это - кешировать шаги deps.get и deps.compile как слой, чтобы мне не приходилось делать это каждый раз, когда я запускаю docker-compose up

1 Ответ

0 голосов
/ 08 мая 2019

Вы используете "/ opt / gametime_app" и "/ opt / gametime", но я не вижу, где создается второй.Возможно, это опечатка?

Также лучше объявить / opt / gametime_app как том в вашем файле Docker:

VOLUME /opt/gametime_app

Это создаст папку во время сборки и даст ейправильный владелец и права доступа.

Что касается файлов, которые не были найдены: это не работает, потому что тома монтируются в контейнерах.Они не доступны во время сборки.Так что для вас во время сборки папка тома пуста.Вы должны переместить всю компиляцию и так далее в сценарии точки входа.Таким образом, он будет работать при запуске контейнера и доступности тома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...