Код выхода 127 из команд оболочки означает «команда не найдена». Является ли .bashrc
исполняемым? Обычно это не так, , вероятно, вы хотите его получить?
source ./home/$USERNAME/.bashrc
strike>
Как указал Дэн Фаррел В своем комментарии поиск файла в команде RUN
будет действовать только внутри этой оболочки.
Если вы хотите, чтобы он имел эффект для более поздних команд в сборке, вам нужно запустить их все в одном выражении RUN
. В приведенном ниже .bashrc
источник в той же оболочке, что и catkin_make
запускается.
RUN . /home/ros/.bashrc && \
cd /home/$USERNAME/catkin_ws && \
catkin_make
Что должно произойти, когда контейнер запускается с помощью docker run
, указывается с помощью оператора ENTRYPOINT
. Если вы просто хотите простую подсказку bash, укажите /bin/bash
. Оболочка будет запускаться с пользователем, указанным в операторе USER
.
Итак, если вы добавите следующее в конец вашего Dockerfile
USER ros
ENTRYPOINT /bin/bash
Когда кто-то запускает контейнер, используя docker run -it
, он попадает в оболочку bash как пользователь ros
. Bash автоматически создаст файл /home/ros/.bashrc
, и все определения внутри будут доступны в оболочке. (Ваш оператор RUN
, содержащий файл .bashrc
, может быть удален
C++ имеет fill
метод от <algorithm>
но это не работает на карты. На самом деле поддержка алгоритма ассоциативных контейнеров обычно не хороша.
В результате необходимо будет использовать взаимодействие или записать соответствующий функтор, который будет использоваться с for_each
(но я полагаю, что это ненужное служебный):
template <typename TKey, typename TValue>
struct resetter : public std::unary_function<std::pair<TKey, TValue> > {
TValue const value;
public resetter(value const& v) : value(v) { }
public void operator ()(std::pair<TKey, TValue>& v) {
v.second = value;
}
};
for_each(map.begin(), map.end(), resetter<Key, Value>(value));
Повышение:: присвойтесь библиотека имеет все виды аккуратного материала для выручения инициализации содержания контейнера. Моя мысль, что это могло использоваться, чтобы не явно выполнять итерации через карту. К сожалению, карты являются любопытными зверями, трудными инициализировать, потому что ключи должны быть уникальными. Нижняя строка - то, что простым для цикла является, вероятно, лучший способ инициализировать карту. Это не может быть супер изящно, но это сделало задание и immediatly понятный любым с любым знакомством с STL.
map <int,string> myMap;
for( int k=0;k<1000;k++)
myMap.insert(pair<int,string>(k,string("")));
Остальная часть этого сообщения описывает поездку, которую я предпринял для достижения вышеупомянутого вывода.
Повышение:: присвойтесь делает простым присвоить небольшое количество значений карте.
map<string,int> m;
insert( m )( "Bar", 1 )( "Foo", 2 );
или
map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
В Вашем случае, где Вы хотите инициализировать всю карту с тем же значением, существует повторение утилит и repeat_fun.
Что-то вроде этого должно работать с мультикартой (непротестированный фрагмент кода)
pair<int,string> init( 0,string(""));
multimap <int,string> myMap = repeat(1000,init);
Как Konrad Rudolph, как указано, Вы не можете инициализировать карту с тем же точным значением, потому что ключи должны быть уникальными.
Это делает жизнь намного более сложной (забава?). Что-то вроде этого, возможно:
map <int,string> myMap;
struct nextkey
{
int start;
nextkey( s ) : start( s ) {}
pair<int,string> operator () ()
{
return pair<int,string>(start++,string(""));
}
};
myMap = repeat_fun(1000,nextkey(0));
Теперь, это становится настолько сложным, я теперь думаю, что простое повторение ЯВЛЯЕТСЯ способом пойти
map <int,string> myMap;
for( int k=0;k<1000;k++)
myMap.insert(pair<int,string>(k,string("")));