【问题标题】:Copy a file from local to docker container via a shell script通过 shell 脚本将文件从本地复制到 docker 容器
【发布时间】:2020-09-24 05:57:11
【问题描述】:

我有以下文件夹结构

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"]

文件.txt

"Hello Hello"

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

我试过这样做docker run -d postgres:1.0 sh -c "cp file.txt ./file.txt",但它不起作用。我也尝试了其他选项,但也没有用。

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

对此的任何帮助表示赞赏

【问题讨论】:

    标签: docker shell docker-compose dockerfile


    【解决方案1】:

    听起来你想要的是将文件安装到 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 上的 f.e Docker volumes vs mount bind - Use cases

    【讨论】:

    • -v 选项必须在 sh 之前
    • @KamiCuk 谢谢,添加了一个安装一个文件的独立示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多