我正在尝试构建一个 docker 容器(我的第一个容器)来为嵌入式设备设置交叉编译环境。
我包含了一个RUN执行脚本的语句,该脚本安装由嵌入式设备制造商提供的 SDK。我验证了,当在正在运行的 docker 容器中手动运行时,脚本成功完成,退出代码为 0。
但是,在 a 期间docker build,相同的脚本会打印其完成消息,然后再没有任何反应。以下RUN语句根本不会执行,构建也不会完成。我必须中止构建过程才能回到我的 shell。谁能想象为什么这个特定的 run 语句没有正确完成,即使执行的脚本成功退出?
有问题的dockerfile:
# origin of the image from the official docker hub
FROM ubuntu:trusty
# adding the SDK into the image
ADD tgur-access-sdk-v0.9.0.tar.gz /opt/
# installing necessary dependencies
RUN apt-get update && apt-get install -y \
g++ \
gcc \
make \
python2.7
# create symlink for python to ensure that the sdk install script succeeds
RUN ln -s /usr/bin/python2.7 …Run Code Online (Sandbox Code Playgroud) 我正在设置一个交叉编译环境作为docker容器.在构建过程中,我为嵌入式设备安装了一个SDK:
ADD sdk.tar /opt
WORKDIR /opt/
RUN sdkinstall.sh
Run Code Online (Sandbox Code Playgroud)
它将sdk安装在一个文件夹中 /opt/sdk/
现在我有一个/opt/sdk/envsetup包含一些环境变量的文件:
export SDKTARGETSYSROOT=/opt/sdk/sysroots/cortexa9hf-vfp-neon-gad-linux-gnueabi
export PATH=/opt/sdk/sysroots/x86_64-gadsdk-linux/usr/bin:/opt/sdk/sysroots/x86_64-gadsdk-linux/usr/bin/arm-gad-linux-gnueabi:$PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
.... and so on
Run Code Online (Sandbox Code Playgroud)
通常,当我在容器中运行shell时,我会这样做source /opt/sdk/envsetup,然后从shell编译东西.
但是,我想要实现的是所有这些环境变量都存在于docker容器内的系统范围内,并且当我例如做类似的事情时会考虑到这些变量. docker run -it xyz:latest make <somedir>
我通过调用测试这个docker run -it xyz:latest echo $SDKTARGETSYSROOT,我期待容器打印/ opt/sdk/sysroots/cortexa9hf-vfp-neon-gad-linux-gnueabi`
到目前为止,我试图实现这一目标:
RUN cat /opt/sdk/environment-setup-cortexa9hf-vfp-neon-gad-linux-gnueabi | cut -d" " -f 2 >> /etc/environmentRUN echo -e "# Auto source some variables\nsource /opt/sdk/environment-setup-cortexa9hf-vfp-neon-gad-linux-gnueabi" >> [...]ENV SDKTARGETSYSROOT /opt/sdk/sysroots/cortexa9hf-vfp-neon-gad-linux-gnueabi,只是为了测试行为.或/bin/bash -c …我在 QT 项目中遇到了一个头文件的问题。
通常我使用以下结构:
#ifndef global
#define global
#include <QLoggingCategory>
Q_DECLARE_LOGGING_CATEGORY(cat)
#endif
Run Code Online (Sandbox Code Playgroud)
#ifndef foo
#define foo
#include "global.h"
class foo{
public:
void bar();
};
#endif
Run Code Online (Sandbox Code Playgroud)
#include "foo.h"
Q_LOGGING_CATEGORY(cat, "awesomecategory")
void foo::bar(){
qCDebug(cat) << "helloworld";
}
Run Code Online (Sandbox Code Playgroud)
这很好用。现在我有一个头文件,它从内部实现了一个模板化函数,我想登录到我的日志记录类别:
#ifndef foo
#define foo
#include "global.h"
template <typename T>
bool bar(T, int val);
// Template definitions outside of header:
#include "foo.tpp"
#endif // foo
Run Code Online (Sandbox Code Playgroud)
#include <QLoggingCategory>
Q_LOGGING_CATEGORY(cat, "awesomecategory")
template <typename T>
bool bar(T, int val)
{
T baz;
// …Run Code Online (Sandbox Code Playgroud)