2016-09-06 17 views
2

Когда я использую Docker на своей машине, я хочу получить доступ к Postgres моей системы. Это до развертывания моих изображений в AWS, где я хочу использовать RDS.Как получить доступ к моей локальной системе Postgres from Docker

Я выполнил шаги на Docker's Quickstart: Docker Compose and Rails page, за исключением того, что, поскольку я работал с существующим приложением, я не создал начальный минимальный Gemfile, который просто загружает Rails.

Вне контейнера Докер, установлен и работает правильно Postgres:

$ which postgres 
/Applications/Postgres.app/Contents/Versions/latest/bin/postgres 
$ which pg_restore 
/Applications/Postgres.app/Contents/Versions/latest/bin/pg_restore 
$ which pg_dump 
/Applications/Postgres.app/Contents/Versions/latest/bin/pg_dump 

приложение работает отлично без Докер в течение многих лет. Для того, чтобы протестировать приложение вне контейнера Докер еще раз, я закомментировать одну строку рекомендуемого docker-compose.yml файла Docker в следующем виде:

development: &default 
    adapter: postgresql 
    encoding: unicode 
    database: postgres 
    pool: 5 
    username: postgres 
    password: 
    # host: db 

test: 
    <<: *default 
    database: myapp_test 

Когда я делаю это, я могу запустить rake db:test:clone (например) вне контейнера не беспокойтесь:

Но когда я раскомментировать эту строку и подключиться к TTY в контейнере, я во всех видах боли:

/myapp# rake db:test:clone           
pg_dump -s -x -O -f /myapp/db/structure.sql postgres 
Please check the output above for any errors and make sure that `pg_dump` is installed in your PATH and has proper permissions. 
/myapp# which postgres 
/myapp# which pg_restore 
/myapp# which pg_dump 
/myapp# 

Что я могу сделать?

Dockerfile, на основе инструкций Docker с несколькими дополнительными двоичными файлами, необходимых моим существующим приложением, является:

FROM ruby:2.3.1-slim 

RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 
RUN apt-get update 
RUN apt-get install -qq -y --no-install-recommends --fix-missing apt-utils 
RUN apt-get install -qq -y --no-install-recommends --fix-missing build-essential 
RUN apt-get install -qq -y --no-install-recommends --fix-missing git 
RUN apt-get install -qq -y --no-install-recommends --fix-missing xvfb 
RUN apt-get install -qq -y --no-install-recommends --fix-missing qt5-default 
RUN apt-get install -qq -y --no-install-recommends --fix-missing libqt5webkit5-dev 
RUN apt-get install -qq -y --no-install-recommends --fix-missing gstreamer1.0-plugins-base 
RUN apt-get install -qq -y --no-install-recommends --fix-missing gstreamer1.0-tools 
RUN apt-get install -qq -y --no-install-recommends --fix-missing gstreamer1.0-x 
RUN apt-get install -qq -y --no-install-recommends --fix-missing nodejs 
RUN apt-get install -qq -y --no-install-recommends --fix-missing libpq-dev 

RUN mkdir /myapp 
WORKDIR /myapp 

ADD Gemfile /myapp/Gemfile 
ADD Gemfile.lock /myapp/Gemfile.lock 
RUN bundle install 

ADD . /myapp 

по теме: Я могу видеть redis-cli снаружи контейнера, но не внутри него. Это тоже будет проблемой, если я разрешу ситуацию в Postgres.

Update

Когда я иду в, как это ...

docker-compose run web rake db:create 
docker-compose run web rake db:test:clone 

... кажется, я могу получить доступ к Postgres, но не pg_dump и другие утилиты, необходимые для rake db:test:clone, rake db:test:load или аналогичный ,

Update II

Я добавил следующее в Dockerfile:

RUN apt-get install -qq -y --no-install-recommends --fix-missing postgresql-client 

Теперь, вместо того, чтобы дать мне "не может быть найден", он говорит:

pg_dump: server version: 9.5.4; pg_dump version: 9.4.9 
pg_dump: aborting because of server version mismatch 

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

Помогло бы мне, если бы я понизил Postgres Mac до версии, полученной apt-get? Обновление версии установленной на apt-get, кажется, не быть одним из вариантов:

Step 15 : RUN apt-get install -qq -y --no-install-recommends --fix-missing postgresql-client-9.5 
---> Running in 614b88701710 
E: Unable to locate package postgresql-client-9.5 
E: Couldn't find any package by regex 'postgresql-client-9.5' 

ответ

2

Это не «Ера делает это неправильно», это сложно. Я пропустил вход в докер, который вы связали, и я не мог заставить его работать.

Вот что я сделал для нашего приложения. Я создал наше приложение с базовым изображением, названным в честь приложения. Базовое изображение названо в честь приложения. Поэтому, используя ваш пример, он будет называться myapp_base. Я не вижу ваш файл docker-compose.yml здесь, поэтому сделаю некоторые предположения.

web: image: your_company/myapp_base links: - db volumes: - .:/myapp # ports: # - "3002:3002" # env_file: # - .myapp.env

порт и env_file не нужны, но они могут пригодиться позже. Myapp_base построен со странным рабочим процессом, который тянет в отпечатки, но в основном бросает в postgres-client, если приложение объявлено нуждающимся в postgres. Это у шеф-повара, но это в основном myapp runlist needs postgresql. Мы действительно уходим от этого и пытаемся поместить файл настройки в скрипты и сам файл Docker.

Итак ... просто добавьте apt-get install postgres-client в свой файл Dockerfile, пометьте его как myapp_base и используйте его в вашем файле docker-compose.yml. Затем запустите файл docker-compose run web rake db и найдет psql.

+1

Спасибо. Это выглядит в принципе так, как должно работать. (Но тогда и докеры дописывали.) Но в конце концов я закончил развертывание на ElasticBeanstalk без Docker. –