2015-10-04 1 views
7

Я использую docker-compose для предоставления среды разработчикам. Приложение работает нормально на команде docker-compose build и работает на 0.0.0.0:3000 по команде docker-compose up. Когда я пытаюсь запустить команду docker-compose run web rails g controller, чтобы сгенерировать контроллер с действием, чем файлы сгенерированы, но не имеют прав на редактирование на хосте.Файлы, созданные с помощью docker-compose run web rails g controller, не имеют прав для редактирования

Dockerfile

FROM ubuntu:14.04 
FROM ruby:2.2.1 
# Run updates 
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev 

# Set up working directory 
RUN mkdir /xyz/ 
WORKDIR /xyz/ 

# Set up gems 
ADD Gemfile /xyz/Gemfile 
ADD Gemfile.lock /xyz/Gemfile.lock 

RUN bundle install 

# Finally, add the rest of our app's code 
# (this is done at the end so that changes to our app's code 
# don't bust Docker's cache) 
ADD . /xyz 

Я даже пытался добавить пользователя xyzuser, но не работает.

# Create a user imliuser to run app that is not root 
RUN useradd --create-home --home-dir /xyz --shell /bin/bash xyzuser 
RUN chown -R xyzuser /xyz 

докер-compose.yml

db: 
    image: postgres 
    ports: 
    - "5432" 

redis: 
    image: redis 
    ports: 
    - "6379" 


web: 
    build: . 
    command: bundle exec rails s -b 0.0.0.0 
    volumes: 
    - .:/xyz:rw 
    ports: 
    - "3000:3000" 
    links: 
    - db 
    - redis 

Когда я бегу docker-compose build, а также получить предупреждение, don't run bundler as root.

Еще одна ошибка, которую я получаю, - это когда сборщик начинает устанавливать драгоценные камни, который драгоценный камень, указанный в качестве публичного репозитория git, не был установлен.

gem 'workflow', :git => '[email protected]:xyz/workflow.git', 
:branch =>'feature_state_to_integer' 

Получение следующей ошибки.

Host key verification failed. 
fatal: Could not read from remote repository. 

Даже если хранилище является публичной

+3

Кстати, вы не можете иметь две строки 'FROM' в вашем' Dockerfile'. Один из них просто игнорируется (я думаю, первый). – dnephin

ответ

1

Docker контейнеры запустить приложение в качестве суперпользователя по умолчанию. Вам нужно будет указать sudo chown, чтобы установить их в качестве пользователя или создать пользователя на изображении с тем же идентификатором пользователя.

+0

Но как это сделать. Я попытался добавить пользователя и сделал chown, но не работал. Dockerfile не использует переменную среды bash, чтобы я мог обрабатывать файлы для моего хост-пользователя. –

+0

Я сделал то, что вы можете прочитать в моем вопросе, но не имеет никакого эффекта. Можете ли вы точно сказать, что это лучший способ сделать это? –

+0

Чтобы назначить данный идентификатор пользователю при его создании, просто добавьте аргумент '-u' в команду' useradd'. Чтобы увидеть идентификатор пользователя хоста, запустите: 'id -u username'. –

4

Вы обнажая три вопроса, в вашем вопросе:

  1. Вы не имеет доступ к файлам, написанным грузчиком в установленном объеме.
  2. Вы получите предупреждение don't run bundle as root.
  3. У вас нет доступа к github, потому что Host key verification failed.

Найти ниже мои предложения для каждого из них:

1) Вы можете получить доступ к любому файлу в системе хоста, если у вас есть root доступ к нему. Поэтому я предполагаю, что вы этого не делаете, но пользователь находится в группе docker, что позволяет запускать команды докеров. Во-первых, найти идентификатор пользователя такого пользователя:

id -u xyzuser 
1000 

В приведенном выше примере идентификатор пользователя 1000.Затем добавьте useradd команду в Dockerfile такие же, как вы делали в вашем посте, но добавив дополнительный аргумент (-u):

RUN useradd -u 1000 --create-home --home-dir /xyz --shell /bin/bash xyzuser 

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

В качестве альтернативы вы также можете использовать команду USER в файле Docker, чтобы указать пользователя во время сборки, как было опубликовано в удаленном ответе.

2) Ошибка очень ясна, вы не можете запускать связку как root, я бы сказал, что ваше решение состоит в том, чтобы изменить пользователя, который будет запускать команды внутри контейнера докера. Вы можете использовать аргумент user в вашем файле .yaml, чтобы изменить его. Пример:

web: 
    build: . 
    user: xyzuser 
    command: bundle exec rails s -b 0.0.0.0 
    volumes: 
    # Avoid to use relative paths during 
    # testing stage 
    - /abs/path/to/current:/xyz 
    ports: 
    - "3000:3000" 
    links: 
    - db 
    - redis 

3) Чтобы решить эту ошибку Host key verification ... вам нужно управлять, чтобы добавить хост контейнера known_hosts файла. Способ сделать это заключается в следующем:

ssh-keyscan -H github.com >> ~/.ssh/known_hosts 

В файле Docker, вы можете добавить строку:

RUN ssh-keyscan github.com >> /root/.ssh/known_hosts 

до драгоценных камней, созданных. Убедитесь, что вы добавили ключ хоста в каталог .ssh фактического пользователя, который будет подключаться к github.

Причина этого в том, что вы подключаетесь к github через ssh, и этот протокол использует «отпечатки пальцев» для идентификации сервера клиенту. Взгляните на ответ Джайлса, если вы хотите узнать больше об этом: https://unix.stackexchange.com/questions/42643/ssh-key-based-authentication-known-hosts-vs-authorized-keys

0

Запустите следующую команду в консоли из каталога проекта. Это даст вам разрешение на редактирование. sudo chown -R $USER:$USER .