[英]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。 我正在使用最新的高山容器(沒有圖像標簽)。
它的行為方式:
出了什么問題:
time(NULL);
返回 ((time_t) -1) 和 error=1: "Operation not allowed" 但是,如果我在容器的灰燼中執行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。 我正在使用最新的高山容器(沒有圖像標簽)。
它的行為方式:
出了什么問題:
time(NULL);
返回 ((time_t) -1) 和 error=1: "Operation not allowed" 但是,如果我在容器的灰燼中執行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。 我正在使用最新的高山容器(沒有圖像標簽)。
它的行為方式:
出了什么問題:
time(NULL);
返回 ((time_t) -1) 和 error=1: "Operation not allowed" 但是,如果我在容器的灰燼中執行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.