Как освободить место, которое использовалось ранее, но удаляется позже в образе докера

Здесь есть два шага:

  • Разбор данных. Ваш пример не полностью воспроизводимый, это данные в файле или переменная в текстовой или факторной переменной? Предположим, что последний, тогда, если вы data.frame называетесь X, вы можете сделать
 X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")

Теперь столбец newdate должен иметь тип Date.

  • Отформатируйте данные. Это вопрос вызова format() или strftime():
 format(X$newdate, "%Y-%m-%d")

Более полный пример:

R> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), 
+                    mid=c(0.8378,0.8457,0.8147))
R> nzd
        date    mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
R> nzd$newdate <- strptime(as.character(nzd$date), "%d/%m/%Y")
R> nzd$txtdate <- format(nzd$newdate, "%Y-%m-%d")
R> nzd
        date    mid    newdate    txtdate
1 31/08/2011 0.8378 2011-08-31 2011-08-31
2 31/07/2011 0.8457 2011-07-31 2011-07-31
3 30/06/2011 0.8147 2011-06-30 2011-06-30
R> 

Разница между столбцами три и четыре - это тип: newdate имеет класс Date, тогда как txtdate является символом.

1
задан Gaofeng Zhu 28 February 2019 в 09:39
поделиться

2 ответа

Каждый оператор RUN, который вы добавляете в Dockerfile, создает новый слой, и в конце все слои объединяются (не объединяются напрямую, есть некоторые правила) для построения окончательного изображения. Даже если вы измените / удалите какой-то файл на верхнем слое, он не удалит его с нижних слоев, а лишь каким-то образом затеняет его.

Вот пример Dockerfile:

FROM baseimage
RUN wget -O file http://...
RUN rm file

Для простоты, изображение, которое baseimage составляет 100 МБ, file составляет 80 МБ, и для этой сборки создано три слоя. Первый уровень - 100 МБ, второй - 80 МБ, последний имеет только некоторые метаданные, чтобы указать, что файл со второго уровня удален. Таким образом, результирующее изображение будет 180 МБ (состоит из трех слоев), даже если вы удалите 80 МБ на последнем слое.

Но если вы получите, установите и удалите один и тот же слой, вы увидите разницу:

FROM baseimage
RUN wget -O file http://... && rm file

Теперь ваш первый слой равен 100 МБ, а второй - ~ 0 МБ (поскольку вы удаляете файл в том же выражении RUN), и ваш образ равен 100 МБ.

В двух словах, вы должны установить и удалить в одном выражении RUN.

0
ответ дан zeynel 28 February 2019 в 09:39
поделиться

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

# Stage 1: Build code
FROM <your image> as builder 
RUN <your build instructions>

# Stage 2: Run code
FROM <your image>  
# Copy artifacts from 'builder' stage 
COPY --from=builder <src folder from builder> <target folder>
# Run your code
CMD [...]

Подробности можно найти в документации

.
0
ответ дан f.loris 28 February 2019 в 09:39
поделиться