簡體   English   中英

在 arm 上的 docker 容器中運行 C musl 應用程序時出現 time() 問題

[英]Issues with time() when running a C musl application in docker container on arm

當我的應用程序在 arm 設備上的高山 docker 容器中運行時,我的應用程序無法處理像time(2)這樣的時間操作。

我所擁有的:我正在構建一個本地 c 應用程序,該應用程序使用來自 musl.cc (arm-linux-musleabihf-gcc) 的工具鏈靜態鏈接到 musl。 我正在使用最新的高山容器(沒有圖像標簽)。

它的行為方式:

  • 直接在 arm 設備上運行二進制文件按預期工作
  • 在 x64 設備上的 alpine 容器中運行按預期工作
  • 在 arm 設備上的 alpine 容器中運行不起作用

出了什么問題:

  • time(NULL); 返回 ((time_t) -1) 和 error=1: "Operation not allowed"
  • 日志輸出中的時間戳具有曲柄時間戳
  • SSH 握手失敗,因為遠程證書的有效期在未來。

但是,如果我在容器的灰燼中執行date ,則 output 是有效的。 因此,似乎存在僅在 ARM 架構上的 alpine 容器中出現的問題。 有趣的是,我正在從 Ubuntu 切換到 Alpine,因為我們在那里遇到了類似的問題

有誰知道我做錯了什么?

更新 #1:ubuntu 上的同樣問題。 所以問題似乎出在任何 docker 基礎圖像上,但僅在 arm 設備上。

更新#2:這是一個最小的例子TimeTest.c

#include <stdio.h>
#include <string.h>
#include "time.h"
#include "errno.h"

int main()
{
    printf("hallo\n");

    time_t myTime;
    time_t result = time(&myTime);

    printf("result: %lld\n", result);

    if ((long)result < 0)
    {
        printf("time() error=%d: %s\n", errno, strerror(errno));
    }
    else
    {
        struct tm* tm_info = localtime(&myTime);
        printf("Current local time and date: %s\n", asctime(tm_info));
    }

    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 3.8)
project ("TimeTest")
if(BUILD_TARGET STREQUAL "ARM_MUSL")
    set(CMAKE_SYSTEM_PROCESSOR arm)
    set(CMAKE_C_COMPILER /usr/bin/arm-linux-musleabi-gcc)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-stack-protector -mfloat-abi=softfp -static --static")
    set(CMAKE_LINK_SEARCH_END_STATIC TRUE)
endif()
add_executable (TimeTest "TimeTest.c")

Output 在 arm 設備上

pi@raspberrypi:/tmp $ docker run --rm -it -v /tmp/TimeTest:/TimeTest alpine ash
/ # /TimeTest
hallo
result: -4696377169665647048
time() error=1: Operation not permitted

當我的應用程序在 arm 設備上的高山 docker 容器中運行時,我的應用程序無法處理 time (2)之類的時間操作。

我所擁有的:我正在構建一個本機 c 應用程序,該應用程序使用來自 musl.cc (arm-linux-musleabihf-gcc) 的工具鏈靜態鏈接到 musl。 我正在使用最新的高山容器(沒有圖像標簽)。

它的行為方式:

  • 直接在 arm 設備上運行二進制文件按預期工作
  • 在 x64 設備上的 alpine 容器中運行按預期工作
  • 在 arm 設備上的 alpine 容器中運行不起作用

出了什么問題:

  • time(NULL); 返回 ((time_t) -1) 和 error=1: "Operation not allowed"
  • 日志輸出中的時間戳具有曲柄時間戳
  • SSH 握手失敗,因為遠程證書的有效期在未來。

但是,如果我在容器的灰燼中執行date ,則 output 是有效的。 因此,似乎存在僅在 ARM 架構上的 alpine 容器中出現的問題。 有趣的是,我正在從 Ubuntu 切換到 Alpine,因為我們在那里遇到了類似的問題

有誰知道我做錯了什么?

更新 #1:ubuntu 上的同樣問題。 所以問題似乎出在任何 docker 基礎圖像上,但僅在 arm 設備上。

更新#2:這是一個最小的例子TimeTest.c

#include <stdio.h>
#include <string.h>
#include "time.h"
#include "errno.h"

int main()
{
    printf("hallo\n");

    time_t myTime;
    time_t result = time(&myTime);

    printf("result: %lld\n", result);

    if ((long)result < 0)
    {
        printf("time() error=%d: %s\n", errno, strerror(errno));
    }
    else
    {
        struct tm* tm_info = localtime(&myTime);
        printf("Current local time and date: %s\n", asctime(tm_info));
    }

    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 3.8)
project ("TimeTest")
if(BUILD_TARGET STREQUAL "ARM_MUSL")
    set(CMAKE_SYSTEM_PROCESSOR arm)
    set(CMAKE_C_COMPILER /usr/bin/arm-linux-musleabi-gcc)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-stack-protector -mfloat-abi=softfp -static --static")
    set(CMAKE_LINK_SEARCH_END_STATIC TRUE)
endif()
add_executable (TimeTest "TimeTest.c")

Output 在 arm 設備上

pi@raspberrypi:/tmp $ docker run --rm -it -v /tmp/TimeTest:/TimeTest alpine ash
/ # /TimeTest
hallo
result: -4696377169665647048
time() error=1: Operation not permitted

當我的應用程序在 arm 設備上的高山 docker 容器中運行時,我的應用程序無法處理 time (2)之類的時間操作。

我所擁有的:我正在構建一個本機 c 應用程序,該應用程序使用來自 musl.cc (arm-linux-musleabihf-gcc) 的工具鏈靜態鏈接到 musl。 我正在使用最新的高山容器(沒有圖像標簽)。

它的行為方式:

  • 直接在 arm 設備上運行二進制文件按預期工作
  • 在 x64 設備上的 alpine 容器中運行按預期工作
  • 在 arm 設備上的 alpine 容器中運行不起作用

出了什么問題:

  • time(NULL); 返回 ((time_t) -1) 和 error=1: "Operation not allowed"
  • 日志輸出中的時間戳具有曲柄時間戳
  • SSH 握手失敗,因為遠程證書的有效期在未來。

但是,如果我在容器的灰燼中執行date ,則 output 是有效的。 因此,似乎存在僅在 ARM 架構上的 alpine 容器中出現的問題。 有趣的是,我正在從 Ubuntu 切換到 Alpine,因為我們在那里遇到了類似的問題

有誰知道我做錯了什么?

更新 #1:ubuntu 上的同樣問題。 所以問題似乎出在任何 docker 基礎圖像上,但僅在 arm 設備上。

更新#2:這是一個最小的例子TimeTest.c

#include <stdio.h>
#include <string.h>
#include "time.h"
#include "errno.h"

int main()
{
    printf("hallo\n");

    time_t myTime;
    time_t result = time(&myTime);

    printf("result: %lld\n", result);

    if ((long)result < 0)
    {
        printf("time() error=%d: %s\n", errno, strerror(errno));
    }
    else
    {
        struct tm* tm_info = localtime(&myTime);
        printf("Current local time and date: %s\n", asctime(tm_info));
    }

    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 3.8)
project ("TimeTest")
if(BUILD_TARGET STREQUAL "ARM_MUSL")
    set(CMAKE_SYSTEM_PROCESSOR arm)
    set(CMAKE_C_COMPILER /usr/bin/arm-linux-musleabi-gcc)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-stack-protector -mfloat-abi=softfp -static --static")
    set(CMAKE_LINK_SEARCH_END_STATIC TRUE)
endif()
add_executable (TimeTest "TimeTest.c")

Output 在 arm 設備上

pi@raspberrypi:/tmp $ docker run --rm -it -v /tmp/TimeTest:/TimeTest alpine ash
/ # /TimeTest
hallo
result: -4696377169665647048
time() error=1: Operation not permitted

對我來說,在 Raspbian SO 中,可以在 redmine 圖像中正常工作。 這是它報告的錯誤:

不允許操作 - clock_gettime (Errno::EPERM)

我在 docker 撰寫文件中使用 privileged:true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM