通过Shell脚本将文件从本地复制到Docker容器

时间:2020-09-24 05:57:11

标签: docker shell docker-compose dockerfile

我具有以下文件夹结构

db

 - build.sh
 - Dockerfile
 - file.txt

build.sh

PGUID=$(id -u postgres)
PGGID=$(id -g postgres)
CS=$(lsb_release -cs)

docker build --build-arg POSTGRES_UID=${PGUID} --build-arg POSTGRES_GID=${PGGID} --build-arg LSB_CS=${CS} -t postgres:1.0 .

docker run -d postgres:1.0 sh -c "cp file.txt ./file.txt"

Dockerfile

FROM ubuntu:19.10
RUN apt-get update
ARG LSB_CS=$LSB_CS
RUN echo "lsb_release: ${LSB_CS}"
RUN apt-get install -y sudo \
  && sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt eoan-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
RUN  apt-get install -y wget \
  && apt-get install -y gnupg \
  && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
  sudo apt-key add -
RUN apt-get update
RUN apt-get install tzdata -y
ARG POSTGRES_GID=128
RUN groupadd -g $POSTGRES_GID postgres
ARG POSTGRES_UID=122
RUN useradd -r -g postgres -u $POSTGRES_UID postgres
RUN apt-get update && apt-get install -y postgresql-10
RUN locale-gen en_US.UTF-8
RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/10/main/pg_hba.conf
RUN echo "listen_addresses='*'" >> /etc/postgresql/10/main/postgresql.conf

EXPOSE 5432

CMD ["pg_ctlcluster", "--foreground", "10", "main", "start"]

file.txt

"Hello Hello"

基本上,我希望能够构建映像,启动容器并将本机中的file.txt复制到Docker容器中。

我尝试像这样docker run -d postgres:1.0 sh -c "cp file.txt ./file.txt"来做,但是没用。我也尝试过其他选项,但也无法正常工作。

当我运行脚本sh build.sh时,它会运行所有内容,甚至启动一个容器,但不会将该文件复制到该容器中。

对此提供任何帮助

1 个答案:

答案 0 :(得分:0)

听起来像您想要的是将文件安装到Docker容器的位置。

您可以将本地目录挂载到容器中并从内部访问它:

mkdir /some/dirname
copy filet.txt /some/dirname/

# run as demon, mount /some/dirname to  /directory/in/container, run sh
docker run -d -v /some/dirname:/directory/in/container postgres:1.0 sh

最小工作示例:

在Windows主机上:

d:\>mkdir d:\temp
d:\>mkdir d:\temp\docker
d:\>mkdir d:\temp\docker\dir
d:\>echo "SomeDataInFile" > d:\temp\docker\dir\file.txt

# mount one local file to root in docker container, renaming it in the process
d:\>docker run -it -v d:\temp\docker\dir\file.txt:/other_file.txt  alpine

在docker容器中:

/ # ls
bin       etc       lib      mnt     other_file.txt  root    sbin      sys       usr
dev       home      media    opt     proc            run     srv       tmp       var

/ # cat other_file.txt
"SomeDataInFile"
/ # echo 32 >> other_file.txt
/ # cat other_file.txt
"SomeDataInFile"
32
/ # exit

这会将(外部)目录/文件挂载为容器内的文件夹/文件。如果您在docker内部指定了已经存在的目录/文件,它将被遮盖。

返回Windows主机:

d:\>more d:\temp\docker\dir\file.txt
"SomeDataInFile"
32

有关绑定装入或使用卷的方法的更多信息,请参见Serverfault上的Docker volumes vs mount bind - Use cases